使用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运行环境。

完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值