lua調用c模塊

0、前言

由於系統架構的原因,需要在windows下用lua調用c模塊。下面是從網上收集的資料,整理所得。項目測試中,可用!如果不可用,可以差評的哦。

  1. windows環境使用win10系統,其他系統沒有測試過;
  2. lua版本採用lua5.1.4。測試過程中,我使用的源碼編譯得到lua相關的文件;
  3. 推薦一款工具viewdll.exe,它可以輔助檢查dll庫中的函數是否導出


1、下面是add.c文件(稍後會編譯成dll)

#include "stdio.h"
#include "windows.h" 
//用vs2012 x86本機工具命令行編譯

#ifdef   _cplusplus  
extern "C"{
    #endif
    #include "lua.h"
    #include "lauxlib.h"
    #include "lualib.h"

    extern  int  isquare(lua_State *L);
    extern  int  alert(lua_State *L);
    #ifdef _cplusplus
}
#endif

int luaopen_add(lua_State *L){
    lua_register(
            L,              
            "square",       
            isquare   
            );  
    //L是句柄, "alert"是設置的全局新名字, alert是函數指針
    lua_register(L,"alert",alert);
    return 0;
}

//彈框
int alert(lua_State *L)
{
    const char * desc = lua_tostring(L,-1);
    MessageBox(NULL,desc,"alert",MB_OK);
    return 1;
}

//平方
int isquare(lua_State *L){                
    float rtrn = lua_tonumber(L, -1);      
    lua_pushnumber(L,rtrn*rtrn);          
    return 1;                             
}


2、把add.c編譯成目標文件,即add.obj

cl /c add.c /I ./include
說明:include文件夾中放置的是lauxlib.h、lua.h、lua.hpp、luaconf.h、luajit.h和lualib.h等頭文件

3、導出函數到dll,使其對外可見。下面是文件export.def

; export.def
LIBRARY ADD

; MY_DLLMAIN 將成爲生成的dll的名稱
DESCRIPTION ‘test’

EXPORTS
isquare @ 1
alert @ 2
; 這個名稱即爲函數的實際導出名稱 @1爲函數的導出編號

4、把add.obj鏈接成dll庫

link /def:export.def /dll add.obj ./lua5.1.4.lib "kernel32.lib" "user32.lib" "gdi32.lib"
說明:其中lua51.lib我是由源碼生成的,export.def是剛纔手寫的,其他都是windows系統自帶的。

5、app.lua是測試文件,用它來調用dll庫

square = package.loadlib("add.dll", "isquare")

alert = package.loadlib("add.dll", "alert")
print(alert)
print ( square(2) )
alert("222")

lua調用c演示demo

6、整個工程目錄

整個工程目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章