使用g++命令生成dll檔案實現lua呼叫C程式碼
首先安裝gcc環境,下載MinGW,MinGW只是一個管理工具,真正的環境還需要在裡面下載
注意選中下載項後點擊選單項中Installation--->Apply Changes才會開始下載,會下載至MinGw
安裝目錄下,確保bin目錄中存在lua52.dll,lua.exe,gcc.exe,g++.exe,這裡lua52.dll的52代表
的是版本號,可能不一樣。注意需要下載下面的這些目錄。
編寫測試C程式碼,這裡檔名為mLualib.h
#pragma once extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" } //#define LUA_BUILD_AS_DLL extern "C" __declspec(dllexport) int luaopen_mLualib(lua_State *L);
這裡__declspec(dllexport)可以不加,暫時先當他表示匯出dll的標示吧
編寫mLualib.c程式碼
這裡壓入棧的是一個table資料,table變數名為mylib,mylib的有兩個成員average,sayHello,#include <stdio.h> #include "mLualib.h" static int averageFunc(lua_State *L) { int n = lua_gettop(L); lua_Number sum = 0; int i; /* 迴圈求引數之和 */ for (i = 1; i <= n; i++) sum += lua_tonumber(L, i); lua_pushnumber(L, sum / n); //壓入平均值 lua_pushnumber(L, sum); //壓入和 return 2; //返回兩個結果 } static int sayHelloFunc(lua_State* L) { printf("hello world!"); return 0; } static const struct luaL_Reg mylib[] = { {"average", averageFunc}, {"sayHello", sayHelloFunc}, {NULL, NULL} //陣列中最後一對必須是{NULL, NULL},用來表示結束 }; int luaopen_mLualib(lua_State *L) { lua_getglobal(L, "mylib"); if (lua_isnil(L, -1)) { lua_pop(L, 1); lua_newtable(L); } luaL_setfuncs(L, mylib, 0); lua_setglobal(L, "mylib"); return 1; }
分別對應C程式的兩個方法,lua5.1以後不能使用luaL_register,使用無法通過編譯。
使用命令將C程式編譯成dll動態庫
g++ -c -DBUILD_DLL mLualib.c 將c程式碼編譯成.o檔案
g++ -shared -o mLualib.dll mLualib.o -Wl,--kill-at,--out-implib,libmLualib.a C:\MinGW\lib\liblua.a
注意不能用gcc編譯,會編譯失敗
這裡編譯成dll檔案,後面必須加引入的庫,因為lua_getglobal等方法都是在liblua.a
這裡路徑根據自己的路徑填寫,注意生成dll的檔名要和luaopen_XXX的後面部分相對,字首
必須是luaopen_。
注意還需要將lua.exe和lua52.dll複製到自己測試的目錄下,否則執行lua程式呼叫C程式會強制關閉,
檔案目錄:
編寫lua測試程式aa.lua:
require "mLualib"
local ave,sum = mylib.average(1,2,3,4,5)
print(ave,sum) -- 3 15
mylib.sayHello() -- hello world!
require "mLualib"會自動呼叫mLualib.dll中的luaopen_mLualib方法
如果用命令編譯lua程式碼也需要lua執行環境。
完畢
相關推薦
使用g++命令生成dll檔案實現lua呼叫C程式碼
首先安裝gcc環境,下載MinGW,MinGW只是一個管理工具,真正的環境還需要在裡面下載注意選中下載項後點擊選單項中Installation--->Apply Changes才會開始下載,會下載至MinGw安裝目錄下,確保bin目錄中存在lua52.dll,lua.e
如何編譯生成dll檔案以及如何呼叫dll檔案
1.vs2015下生成DLL檔案 檔案->新建->專案 點選確定選擇dll選項和空專案選項 點選完成 為專案新增c++原始檔mydll.cpp extern "C
lua——alien庫實現lua呼叫C動態連結庫(dll、so)
我們知道,lua通過lua_State堆疊可以很方便的與C語言進行互動 也可以呼叫專門為lua呼叫而封裝的C庫。 具體步驟: 1.原C檔案中引入lua相關標頭檔案 #include "lua.h" #include "lualib.h" #include "lauxli
Dev c++工具將C程式碼生成dll檔案以及如何呼叫dll檔案
該篇文章是對工作中一個需求的總結,工作需求是要將C語言的函式介面,生成一個DLL檔案,讓labview呼叫。然後我嘗試用dev c++開發工具來實現這個功能,後來因為DLL生成了,但labview呼
如何使用cocos的自動繫結工具實現lua呼叫c++的類
如何使用cocos的自動繫結工具實現lua呼叫c++的類 主要分成以下步驟 1、建立自己的c++類檔案 2、然後修改和執行引擎資料夾cocos2d-x-3.7\tools\tolua 目錄下的genbindings.py 檔案, 3、編寫自己的ini檔案 4、將生成的繫
通過COM元件方式實現java呼叫C#寫的DLL檔案 轉
最近一段時間單位在做一個Web專案,工程師用JAVA語言,需要公用人員資訊,統一使用者名稱和密碼,原有的平臺中是用C#語言開發的,在網上查詢解決方法,通過JAVA呼叫C#的DLL檔案實現。網上資料很多,自己整合總結了一下,做個備忘。 一、C#寫com元件 開發環境
關於Lua呼叫c++ DLL 檔案的詳解
Lua呼叫c++ dll檔案的詳解 儘管網上類似的例子不少,但是對於很多新手來說,有些問題並沒有說的那麼詳細 直奔主題 在此,我會列出我參考的文章,有些東西就直接複製的 環境:Visual C++ 2008 Express Edition + Lua 1.5 + SciT
C#使用命令列模式編譯生成dll檔案或者exe檔案
若要生成檔案 MathLibrary.DLL,請使用以下命令列編譯檔案 Add.cs 和檔案 Mult.cs: csc /target:library /out:MathLibrary.DLL Add.cs Mult.cs /target:library
實現通過COM元件方式實現java呼叫C#寫的DLL檔案的完整demo
最近因為工作需要,客戶那邊工程師使用的是JAVA語言開發的程式,我們這邊平臺中是用C#語言開發的,因為有些操作必須統一,所以我在網上查詢解決方法,自己也實踐過,在這裡做個筆記吧,分享一下。 一、使用C#編寫com元件 開發環境 :VS2017 1、新建工程:CalcTest(類庫專案,根據自己喜好需要取工
使用axis2 java2wsdl命令生成wsdl檔案
1.eclipse新建web工程,編寫service介面方法 2.axis2環境變數配置(必須配置環境變數,否則執行java2wsdl命令時無法識別路徑),如下: 新建環境變數:AXIS2_HOME 值為axis2解壓路徑如:I:\path-jar\a
解決方案:VS解決方案中出現無法生成DLL檔案
前言: 這幾天在學習牛腩新聞釋出系統,突然發現標準的過程原來是從D層倒著往U層敲,在敲的過程中,遇到了一個問題:D層生成的DLL檔案,在B層和U層中使用不了! 從早上10:00~15:30,自己弄了好久沒弄出來,在趙雨田的幫助下,一下子就發現了問題! 問題的
【Linux】命令寫在檔案中並呼叫awk -f
我們在使用awk命令的時候,有時候命令特別長,在終端寫出來格式太亂,難以閱讀,以下是一個將命令寫在檔案中,並使用awk呼叫的具體案例 1.現在有檔案file3.txt,內容如下: 2.ak2.awk指令碼 #列印標題並格式化打印出數量合計 BEGIN { FS="\t" #設定欄位分割符
C++ 基礎(五)使用vs2015封裝c++生成.dll檔案、.lib檔案、.h檔案後,給另一個工程使用:使用前,需配置標頭檔案(.h)靜態庫(.lib)和 動態庫(.dll )專案屬性
一、簡介 我是一個認真的人,要麼不寫,要麼我就把步驟、截圖、程式碼,一 一 附上,方便大家參考學習。 1、為什麼要生成DLL和lib? 就是為了給VS工程呼叫(比如C#呼叫、C++工程)。 2、C#為什麼要呼叫DLL和lib? C++寫的程
cmd jar命令生成jar檔案
1、建立 jar 包 jar cf HelloWord.jar Hello.java2、建立 jar 包(顯示過程: v 引數) jar cvf HelloWord.jar Hello.java3、列出 jar 包的內容 jar tvf HelloWord.jar4、解壓 jar 包 [windows平臺上
教程:將WPF控制元件轉化為.dll檔案實現控制元件打包重用
最近公司在進行顯控軟體的升級,需要將現有程式的winform介面升級為WPF。由於是剛剛接觸C#和WPF,在開發過程中,自己摸索了一下自定義WPF控制元件的實現方法,在此做個總結。 先通過類庫編譯W
安全之路 —— 無DLL檔案實現遠端程序注入
簡介 在之前的章節中,筆者曾介紹過有關於遠端執行緒注入的知識,將後門.dll檔案注入explorer.exe中實現繞過防火牆反彈後門。但一個.exe檔案總要在注入時捎上一個.dll檔案著實是怪麻煩的,那麼有沒有什麼方法能夠不適用.dll檔案實現
Qt·程式碼封裝成dll檔案及所生成dll檔案的使用
開發環境:Qt5.8.0+Qt Creator 一、程式碼封裝成dll檔案 步驟一:建立工程 圖1:建立生成dll的工程 圖2 圖3 圖4: 此處需要勾選QtCore,因為後面需要使用該庫內QtCo
20、C#:使用VS2010生成dll檔案
假如已經有兩個專案:專案甲,專案乙,專案甲為主專案,專案乙為甲需要引用為DLL的專案 為了將專案乙生成為DLL,只需: 1.右擊專案乙--->屬性--->應用程式,其中最重要的為:目標框架
VS2008編譯C語言生成dll檔案
1、在C#中int關鍵字表示一種整型,是32位的,它對應的.NET Framework型別為System.Int32。 int 和 long是標準C#語言的關鍵字,在Microsoft.NET中相當於有一個別名:Int32 和 Int64。 2、編譯生成DLL檔案 1)開啟
C#呼叫c程式碼生成的dll,報PInvoke 簽名與非託管的目標籤名不匹配
C# 在呼叫c程式碼生成的dll時,報錯:對 PInvoke 函式“TestJBIG!TestJBIG.JbigHelper::jbigDecode”的呼叫導致堆疊不對稱。原因可能是託管的 PInvoke 簽名與非託管的目標籤名不匹配。請檢查 PInvoke 簽名的呼叫約定