您的位置:首页 > 编程语言 > Lua

使用g++命令生成dll文件实现lua调用C代码

2018-03-08 15:35 513 查看
首先安装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运行环境。
完毕
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: