1. 程式人生 > >使用g++命令生成dll檔案實現lua呼叫C程式碼

使用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程式碼

#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;
    }  
這裡壓入棧的是一個table資料,table變數名為mylib,mylib的有兩個成員average,sayHello,

分別對應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 簽名的呼叫約定