C 與lua之互調問題

2021-09-24 03:08:10 字數 1972 閱讀 8633

error while loading shared libraries: liblua.so: cannot open shared object file: no such file or directory

對於此錯誤,有如下三個解決方案:

配置lua路徑至環境變數

詳情參看博文:linux配置執行環境

將lua相關檔案拷貝至使用者目錄

詳情參看博文:linux配置執行環境

g++ main.cpp -o uninet -isrc/lua/include -lsrc/lua/lib -llua -wl,-rpath=src/lua/lib
# -wl

# gcc引數,使編譯器把之後的引數傳遞給鏈結器

# -rpath

# 1. 新增乙個目錄作為執行時庫的搜尋路徑,在將elf可執行檔案與共享物件鏈結時使用此選項

# 2. 在鏈結時,一些動態庫明確的鏈結其他動態庫,則此選項也可用於定位這些鏈結的動態庫

# 3. 在執行鏈結時,會優先搜尋此路徑,再去搜尋ld_run_path的路徑

package.cpath =

"./lib/c/?.so"

-- 搜尋路徑

local service = require "sqlconnector"

-- 載入模組

在lua中,使用require載入c++動態庫時,出現如下錯誤:

panic: unprotected error in call to lua api (error loading module 『sqlconnector』 from file 『./sqlconnector.so』:

./sqlconnector.so: undefined symbol: luaopen_sqlconnector)

使用require載入動態庫,其入口函式有規律。

當載入動態庫sqlconnector.so時,其入口函式名必須是luaopen_sqlconnetor。

而使用package.loadlib載入動態庫,需要指定入口函式名,因此可以自定義入口函式名。

local loadlib = package.

loadlib

("./lib/c/sqlconnector.so"

,"luaopen_sqlconnector"

)-- 載入註冊函式

local service =

loadlib()

-- 執行註冊函式,建立並返回新錶

初始編譯的sqlconnector.so依賴於liblua.a,而c++入口程式依賴於liblua.so。

當c++通過lua呼叫sqlconnector.so時,出現以下錯誤:

panic: unprotected error in call to lua api (multiple lua vms detected)

liblua.a是靜態庫,liblua.so是動態庫。

靜態庫會被編譯程序式模組檔案,每個模組都單獨擁有虛擬機器,於是記憶體之中同時存在多個不同虛擬機器。

而動態共享庫只會被載入一次,在記憶體中只存在乙份,供給不同程式不同模組共享呼叫。

若同時使用lua的靜態庫和動態庫,記憶體之中同樣存在多個lua虛擬機器,導致多lua虛擬機器衝突問題。

以上錯誤的解決方案是依賴於liblua.so編譯sqlconnector.so和c++入口程式。

此外,動態編譯lua直譯器,不能靜態編譯lua直譯器,否則在呼叫c模組之時也會出現以上錯誤。

如果lua採用靜態編譯,即包含lua靜態庫,在執行時載入乙個lua虛擬機器,當lua呼叫c模組時,由於c模組在編譯之時,需要指定lua的靜態庫或者動態庫,再載入乙個lua虛擬機器,此時存在多個lua虛擬機器,造成衝突。

lua與C 相互呼叫

新建乙個工程,將編譯出來的lua.lib包含進來,就可以開始用了 1 c 呼叫 lua 編寫 如下 include using namespace std pragma comment lib,lua.lib extern c void main int nret lual loadfile l,l...

lua和c 相互呼叫

include include include include include extern c lua state l int luaadd lua state l,int x,int y extern int cl domylua lua state l extern int cl drawte...

使用tolua 實現C 與LUA相互呼叫

lua是一種目前很流行的高效精簡的指令碼語言。lua乙個特點是比較方便的與c通訊。然而要在指令碼中使用c 類使用基本的lua方法還是比較麻煩,純手工暴露乙個類的介面到lua工作量還是很大的,而且都是一些簡單的重複勞動。好在有tolua 這個工具,可以讓程式設計師從簡單的重複勞動解脫出來。tolua ...