編寫Lua調用C/C++庫的動態庫文件


編寫Lua調用C/C++的接口

環境:VS2017 commity 、Lua3.4

在VS2017中創建一個空項目,項目MyUtil。

鼠標右鍵項目,配置選“所有配置”,平台選“所有平台”。

常規:

輸出目錄:$(SolutionDir)..\bin\$(Platform)\$(Configuration)\

中檢目錄:$(SolutionDir)..\bintemp\$(Platform)\$(ProjectName)\$(Configuration)\

項目默認值中,配置類型選“動態庫(.dll)”

 

 我將下載好的lua源碼和這個項目放在同一個目錄下,luasrc是所有lua源碼。

 

 在項目中,添加interface.cpp文件,文件中的代碼。

 1 #include <windows.h>
 2 //使用 lua標准頭文件
 3 #include "../luasrc/lua.hpp"
 4 
 5 //累計傳入參數的和
 6 static int util_sums(lua_State *L) {
 7     int number = lua_gettop(L);//獲取參數個數
 8 
 9     lua_Number sum = 0.0;//定義累計值
10     for (int i = 1; i <= number; ++i) {
11         if (!lua_isnumber(L, i)) {//第i參數
12             lua_pushliteral(L, "參數有錯");
13             lua_error(L);//拋出異常
14         }
15         sum += lua_tonumber(L, i);//將第i個參數轉換為浮點數,加到sum上
16     }
17     lua_pushnumber(L, sum);//將累計值壓入棧
18     lua_pushstring(L, "愛白菜的小昆蟲");//再壓個字符串進棧
19     return 2;//返回值的個數
20 }
21 
22 //定義注冊表
23 static const luaL_Reg util[] = {
24     // lua使用的名字,這里的函數名字
25     {"xqlSums", util_sums},
26     {NULL, NULL}
27 };
28 
29 //以C語言方式導出luaopen_MyUtil函數
30 extern "C" __declspec(dllexport)
31 int luaopen_MyUtil(lua_State *L) {//函數接口規則:luaoepn_編譯的庫名字
32     luaL_newlib(L, util);//將函數名和函數注冊
33     return 1;
34 }
View Code

鼠標右鍵項目,點擊鏈接器->常規->附加庫目錄。

$(SolutionDir)..\bin\$(Platform)\$(Configuration)\;%(AdditionalLibraryDirectories)

點擊鏈接器->輸入->附加依賴項:luadll.lib(自己拿到lua源碼編譯的動態庫,生成之后的lib文件。)

 

 

 

 

將項目編譯生成動態庫文件。

使用VS 2017的開發人員命令提示符,到生成的目錄,使用

dumpbin /exports MyUtil.dll 查看是否導出函數

 

 在庫目錄下,新建一個txt文件,修改名字為test.lua

 

 lua代碼

local obj = require("MyUtil")

print(obj.xqlSums(1, 2, 3, 4, 5, 6))

在命令行中,用lua解析器執行test.lua

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM