如何用C/C++生成一个为lua所用的动态库dll文件以及lua如何调用该dll(C语言的动态库)
如果讀者朋友想詳細的了解lua與C的通信原理,請移步這里【https://www.zhangshengrong.com/p/ERNnAzWa5W/】;
先說兩句廢話:怪不得lua不火,因為它對我們新手太不友好了。比如生成一個為lua調用dll的文件這么簡單的小事,昨天我按照網上給出的教程總是出錯(而且網上關于這方面的資料少的可憐!),最后還是通過自己的不斷嘗試修成正果,所以還是在這兒寫博便記,下面進入正題。
首先是下載一個lua源碼包,這里我選擇的是lua5.1.5(本來我用的是lua-5.4,但是遇到了各種坑,編譯的,運行的等等),朋友們可以去這里下載【https://mp.csdn.net/console/upDetailed】,解壓縮之后,把它隨便弄到一個地方。
其次,使用VS創建一個動態庫項目,具體步驟,打開VS-》創建新項目-》選擇window桌面向導,然后給項目命名(不要瞎起名,因為這決定您生成的dll名字),我這里給項目的命名是【MyLuaDll】,記住這個名字!
然后,點擊創建,VS會彈出一個【window桌面向導】對話框,這里一定要把應用程序類型改成【動態鏈接庫(.dll)】,最好把下面的【空項目】也勾選上,之后點擊確定,項目就創建完成了,記住這個項目創建的路徑。
接著,去到我們解壓縮后的lua-5.1.5文件夾下的【src】文件夾下,復制里面所有的文件(注意,除了【lua.c】和【luac.c】,這兩個文件不要復制!),然后來到我們剛才創建的【MyLuaDll】項目根目錄下,把方才復制的所有文件直接粘貼進來。
再接著,打開VS,鼠標右鍵點擊我們的項目,選擇【添加】-》【現有項】,點擊后彈出一個對話框,在對話框里找到我們的項目根目錄,然后選擇剛才粘貼進去的所有文件,如下圖所示:
完成上面的步驟之后,我們還需要添加一個自定義的cpp文件,鼠標右鍵項目然后添加新文件,文件名隨便取,我選擇的是【abcd.cpp】,把它添加到項目里之后,就可以在它上面書寫源代碼了,我的源代碼內容如下:
#include <iostream> #include <windows.h> extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" }extern "C" int func1(lua_State* luaEnv) // 這里可以這樣寫,也可以寫成static {std::cout << "welcome to C world,first at all,allow me to sleep for 3 second." << std::endl;Sleep(3000);std::cout << "i am dll, now i wake up!" << std::endl;return 0; } static int func2(lua_State* luaEnv)//在lua中,調用這個函數時,需要傳入兩個number類型值 {auto op1 = luaL_checknumber(luaEnv, 1);//檢查棧頂的元素是不是number類型,然后賦值給op1auto op2 = luaL_checknumber(luaEnv, 2);lua_pushnumber(luaEnv, op1+op2); //計算op1+op2的結果值,然后壓入lua棧頂(返回給lua)lua_pushstring(luaEnv, "i am dll of C,my work is done, goodbye!"); //再返回給lua一個字符串return 2; //這句代碼作用是告訴lua"本函數要返回給你幾個東西",比如上面返回了一個數值和一個字符串,所以這里應該返回2 }static luaL_Reg mylibs[] //我們需要弄一個表,而表中的內容就是我們需要導出的這個文件里的函數 = {{"aaa", func1}, //第一項可以隨便取名,但要記住,因為在lua中調用這個函數時,用到的就是我們這里取的名字{"bbb", func2},{NULL , NULL} //最后不要忘了用null收尾 };extern "C" __declspec(dllexport) //下面函數的作用是定義一個module名,以備在lua中require int luaopen_MyLuaDll(lua_State* luaEnv) //請注意!這句代碼中“luaopen_”后面的“MyLuaDll”,不能亂取名,一定要與您的dll名字一致! {/***很重要的一句代碼,2參是字符串,內容一定要與上面的luaopen_后面的內容或者說我們的dll名字一致!最后的參數就是我們需要導出的表***/luaL_register(luaEnv, "MyLuaDll", mylibs);return 1; }代碼寫好之后,點擊項目的生成按鈕生成文件,不出意外的話VS會報錯,大概如下圖:
沒關系,我們慢慢來【不用設置安全檢查為否啥的,因為我試了,在我機器上沒用,還是報錯】,那么如何解決上面的錯誤呢,方法很簡單,首先雙擊錯誤提示最上面的那句話,然后VS會打開對應的文件,在該文件的最上面添加一句代碼【#pragma warning(disable : 4996)】,如下圖:
完成之后,重新生成一下,不出意外還會報錯(但報錯的數量比上次要少幾個),沒關系,重復上一次的步驟:雙擊某行報錯提示,進入對應文件,在文件代碼的上面添加【#pragma warning(disable:4996)】,然后再重新生成一下,再報錯,再添加,如此重復,報錯會不斷減少,一直到最后,總有一刻我們會真的生成了dll文件【應該是在項目的debug目錄下】
然后,讓我們隨便在某個地方創建一個lua文件,我這里是在桌面上創建的【test.lua】,內容如下:
local obj = require("MyLuaDll") print("welcome to lua!") obj.aaa(); print("now come back lua") local n, s = obj.bbb(33,66) print('now in lua,this is last words of C dll: "'..s..'"') print("dll return value is:",n)最后,我們去我們剛才的項目里的debug文件夾下,找出我們生成的【MyLuaDll.dll】文件,復制它,然后回到剛才創建的lua文件的同目錄下,把【MyLuaDll.dll】文件拷貝進來,運行lua文件,就可以看到我們dll工作的樣子的,我的如下圖:
?
總結
以上是生活随笔為你收集整理的如何用C/C++生成一个为lua所用的动态库dll文件以及lua如何调用该dll(C语言的动态库)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机内存卡丢失数据如何恢复
- 下一篇: 修复VSCode关联文件的图标 - Py