Linux環境下 lua 呼叫自定義so動態庫(skynet)
最近看的 skynet 使用的 c+lua 的架構,框架提供的是基礎的api,所以業務邏輯還得自己去寫,如果某些業務邏輯比較耗效能,那可能就需要把某些業務邏輯丟到 c/c++ 去做,提供個介面供 lua 呼叫。
那麼就需要去編個動態庫(.so)、靜態庫(.a)啥的
- 寫c介面(有些型別不嚴謹,就偷懶不改了,編譯時會warning,可無視)
#include <lua.h> #include <lauxlib.h> #include <stdio.h> static int ltest1(lua_State *L) { int num = luaL_checkinteger(L, 1); printf("--- ltest1, num:%d\n", num); return 0; } static int ltest2(lua_State *L) { size_t len = 0; const char * msg = luaL_checklstring(L, 1, &len); printf("--- ltest2, msg:%s, len:%d\n", msg, len); return 0; } static int ltest3(lua_State *L) { size_t len = 0; int num = luaL_checkinteger(L, 1); const char * msg = luaL_checklstring(L, 2, &len); printf("--- ltest3, num:%d, msg:%s, len:%d\n", num, msg, len); return 0; } int luaopen_myLualib(lua_State *L) { luaL_Reg l[] = { { "test1", ltest1 }, { "test2", ltest2 }, { "test3", ltest3 }, { NULL, NULL }, }; luaL_newlib(L, l); return 1; }
- 寫makefile檔案
CC ?= gcc CFLAGS = -g -O2 -Wall -I$(LUA_INC) SHARED := -fPIC --shared TARGET = myLualib.so LUA_CLIB_PATH = clib # 引入lua標頭檔案 LUA_INC ?= /root/lua-5.3.0/src start: $(TARGET) $(TARGET) : myLualib.c | $(LUA_CLIB_PATH) $(CC) $(CFLAGS) $(SHARED) $^ -o [email protected] clean: rm -fr $(TARGET) $(LUA_CLIB_PATH) : mkdir $(LUA_CLIB_PATH)
- 執行以下make命令,注意target是start
# make start
然後myLualib.so
就出來了 - 寫個lua測試以下 (檔名 mylua.lua)
function test3( ... ) print("----- test myCustomLib") package.cpath = "./?.so" --so搜尋路勁 local f = require "myLualib" -- 對應luaopen_myLualib中的myLualib f.test1(123) f.test2("hello world") f.test3(456, "yangx") end test3()
執行以下
# lua mylua.lua
結果[[email protected]]# lua mylua.lua -----testmyCustomLib ---ltest1,num:123 ---ltest2,msg:helloworld,len:11 ---ltest3,num:456,msg:yangx,len:5
相關推薦
Linux環境下 lua 呼叫自定義so動態庫(skynet)
最近看的 skynet 使用的 c+lua 的架構,框架提供的是基礎的api,所以業務邏輯還得自己去寫,如果某些業務邏輯比較耗效能,那可能就需要把某些業務邏輯丟到 c/c++ 去做,提供個介面供
Java呼叫C++編寫的動態庫(JNI)
1. 在eclipse裡利用java建立一個類,在類中加入帶有native的方法(eclipse建立的類會自動新增class在bin目錄下) 2.利用javah命令生成本地方法的c++標頭檔案。進入到工程bin目錄下,按住shift,並右擊,選擇 “在此處開啟命令視窗”,進入命令視
linux/mac下的配置自定義命令alias
root commit 測試 自定義命令 bashrc 文件 自動 一個 cdr linux/mac下的自定義命令alias,並保存別名使其永久生效(重啟不會失效) 在做開發每次提交代碼的命令都是一長串參數,不想去記,於是可以使用alias命令來解決這個問題:alias a
Spring boot專案打包成jar在linux環境下設定開機自啟動【原創】
#!/bin/bash # The three branches of the scouting program,Add to auto. # chkconfig: 2345 20 80 # description: py-0.0.1-SNAPSHOT-exec.jar #
Linux環境下java呼叫ffmpeg命令進行視訊轉碼
1.這是在Linux系統下的程式碼,我執行後可以轉換成功: import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import
VS2017 Linux C++引用自定義的動態庫
++ -1 undefined mage 編譯運行 linux下 lin 套路 log 前一篇博客講了用系統庫libpthread.so的例子,只需要在項目屬性頁的[C++->命令行參數]和[鏈接器->命令行參數]中加上對應參數(比如-pthread)即可,然後
***在Linux環境下mysql的root密碼忘記解決方法(三種)-推薦第三種
href containe 完全 mys init.d 操作 root ubunt upd MySQL密碼的恢復方法之一 1.首先確認服務器出於安全的狀態,也就是沒有人能夠任意地連接MySQL數據庫。 因為在重新設置MySQL的root密碼的期間,MySQL數據庫完全出於沒
Linux環境下mysql讀寫分離以及主從配置(不錯可以的)
記下File及Position下的值。以備在配置從伺服器時使用。 注:File:當前binlog的檔名,每重啟一次mysql,就會生成一個新binlog檔案 Position:當前binlog的指標位置 三、從伺服器配置 1、配置mysql.cnf # vi /etc/my.cnf (1)修改
android 自定義ListView實現下拉重新整理、分頁載入、點選事件——自定義控制元件學習(七)
package com.example.administrator.customerpulldownrefreshandpageload; import android.content.Context; import android.os.Handler; import android.os.Message
00 Linux環境下ARM裸機開發工程的建立示例(Cortex-A8)
Linux環境下ARM裸機開發工程的建立示例(Cortex-A8) 本文將介紹如何在Linux環境下建立一個ARM的裸機開發專案工程,其內容將涉及Linux c語言,ARM組合語言,Linux shell命令與及Linux工程管理器make的配置檔案--Mak
【朝花夕拾】Android自定義View篇之(七)Android事件分發機制(下)解決滑動衝突
前言 前面兩篇文章,花了很大篇幅講解了Android的事件分發機制的原理性知識。然而,“紙上得來終覺淺,絕知此事要躬行”,前面講的那些原理,也都是為解決實際問題而服務的。本文將結合實際工作中經常遇到的滑動衝突案例,總結滑動衝突的場
【朝花夕拾】Android自定義View篇之(七)Android事件分發機制(下)滑動衝突解決方案總結
前言 轉載請宣告,轉自【https://www.cnblogs.com/andy-songwei/p/11072989.html】,謝謝! 前面兩篇文章,花了很大篇幅講解了Android的事件分發機制的
【朝花夕拾】Android自定義View篇之(九)多點觸控(下)實踐出真知
前言 在上一篇文章中,已經總結了MotionEvent以及多點觸控相關的基礎理論知識和常用的函式。本篇將通過實現單指拖動圖片,多指拖動圖片的實際案例來進行練習並實現一些效果,來理解前面的理論知識。要理解本文的程式碼,需要先掌握上一篇的理論知識,事件處理基
xgboost 自定義評價函數(metric)與目標函數
binary ret and 參數 cnblogs from valid ges zed 比賽得分公式如下: 其中,P為Precision , R為 Recall。 GBDT訓練基於驗證集評價,此時會調用評價函數,XGBoost的best_iteration和
ssh環境下客戶信息管理系統學習問題(二)
2.3 根據 包括 style 有用 信息 org 翻譯 use 問題1: 這是包沖突的問題,jar包中存在兩個沖突的包,可以看到上面的Referenced Libraries中存在asm.jar和asm-2.2.3.jar兩個包,這兩個包沖突了
XAF 框架中,自定義參數動作(Action),輸入參數的控件可定義,用於選擇組織及項目
示例 app frame tro href express documents 定義 ron XAF 框架中,如何生成一個自定義參數動作(Action),輸入參數的控件可定義? 參考文檔:https://documentation.devexpress.com/eXpres
AngularJs自定義指令詳解(5) - link
演示 hang cursor off drag font 雙向 事件 date 在指令中操作DOM,我們需要link參數,這參數要求聲明一個函數,稱之為鏈接函數。 寫法: link: function(scope, element, attrs) { // 在這裏操作DO
sench touch 自定義小圖標(轉)
found conf custom cmd svg logs 頁面 一個 會有 自定義圖標的方法 Sencha touch自帶圖標有限,有時需要自己添加圖標。下面介紹自定義圖標的方法: 首先需要生成圖標字體。有許多網站提供在線生成圖標字體的功能,比如IcoMoon,通過這個
vue2 自定義 折疊列表(Accordion)組件
rep link 分享圖片 toggle sset pac baseline object 列表 1.自定義 折疊列表 Accordion.vue <!-- 折疊列表 組件 --> <template> <nav :class="$st
ASP.NET MVC 學習筆記-7.自定義配置信息(後續)
字符串 return abstract 新的 work 生成 value DC 連接字符串加密 自定義配置信息的高級應用 通過上篇博文對簡單的自定義配置信息的學習,使得更加靈活的控制系統配置信息。實際項目中,這種配置的靈活度往往無法滿足項目的靈活度和擴展性。 比如,一個