我也发个求助贴——DLL编译,duno帮忙看看?
这两天研究把lua-gd按照MUSH的要求重新编译成dll,按照gammon的建议,下载了cygwin,安装了lua-5.1.4,安装的时候只在在/usr/local/lib/下生成了liblua.a在cygwin下使用“gcc -shared -o test.dll test.c -L/usr/local/lib/ -llua -llualib” 编译dll,返回ld找不到"-llualib",网上随便找了个liblualib.a下载,又返回一堆未定义的错误……
cygwin这条路,感觉很艰辛……
还有没有什么别的办法编译MUSH下lua可调用的DLL不?
Gammon建议贴:http://www.gammon.com.au/forum/?id=4915 我也去装了下,选择download方式,不行啊。这个东西有什么好处?
gcc装个虚拟机不就有了吗。 你用的linux?dll是windows的东西。
如果在linux下,就用linux的连接库格式编译
但是linux下应该也用不到cygwin
迷惑
囧 1) 如果是用.hpp引入头,要用g++编译,形如
g++ --share mylib.c -o testlib.dll
2) 库搜索
当前目录下文件:lua5.1.dll, test.c
编译命令
gcc -shared -o testlib.dll test.c -L. -llua5.1
-L指定连接库所在路径
-l指定库名称
[ 本帖最后由 duno 于 2009-8-8 03:06 AM 编辑 ] 看来俺说的不是很清楚……
cygwin是一个可以在windows下模拟linux的软件(选择download安装的话,注意找其中tw的网站下载,其中一个还是比较快的,可以先ping一下看一下速度)。
我所用的编译dll方法完全来自Gammon(http://www.gammon.com.au/forum/?id=4915),这个帖子里有一个test.c的例子。
“gcc -shared -o test.dll test.c -L/usr/local/lib/ -llua -llualib” 也是来自这里。但Gammon没有解释清楚如何在cygwin中安装lua,用GOOGLE去SEARCH ”build lua",可以在lua.org上找到如何安装lua,但我去lua.org下载并安装的lua,不能生成liblualib.a这个库,只能生成liblua.a(理想的状况是在/usr/local/lib/生成liblua.a和liblualib.a两个库文件)。
之所以必须要有liblualib.a这个库文件,是因为test.c中有以下两句:
#include "lauxlib.h"
#include "lualib.h"
而这两个头文件中很多的define都与liblualib.a有关。
不知我解释清楚了没?囧 原帖由 duno 于 2009-8-8 03:02 发表 http://pkuxkx.com/forum/images/common/back.gif
1) 如果是用.hpp引入头,要用g++编译,形如
g++ --share mylib.c -o testlib.dll
2) 库搜索
当前目录下文件:lua5.1.dll, test.c
编译命令
gcc -shared -o testlib.dll test.c -L. -llua5.1
-L指 ...
admire duno
niub duno
编译不报错了!可以继续进一步的测试了……
太感谢duno了!hzn 郁闷死了,编译出来的dll在lua中不能被调用…… 1)
static int l_test(lua_State *L) {
double d = luaL_checknumber(L, 1); // 传参
lua_pushnumber(L, d * 0.1); // 返回值
return 1;
};
功能函数,在lua中调用以完成具体运算
2)
static const struct luaL_Reg testlib [] = {
{"test", l_test},
{NULL, NULL}// 表明结尾
};
注册函数入口,把c下的l_test函数以test为名放入testlib列表
3)
__declspec(dllexport)
int luaopen_test(lua_State *L)
{
luaL_register(L, "testlib", testlib);
return 1;
};
注册模块对象
在lua中以(绿)"testlib"引用(红)testlib对象
并通过2)中的关联声明,使lua可以 testlib.test方式调用 l_test函数
调用dll需要dllexport声明(黄)
在 lua中先主动调用(被dllexport声明的) luaopen_test()
然后才能以 testlib.test方式调用c下的 l_test
注
dllexport
(lua_State *L)方式穿参
声明函数调用方式,即上面的testlib.test,先把l_test放入列表,再把列表注册给lua duno辛苦了
massage duno
我再试试…… 发现了Gammon的另一个帖子,MUSH的lua和lua.org的好像有点区别:
http://www.gammon.com.au/forum/?id=7795
看起来还是我的cygwin编译得有问题?……yct12
[ 本帖最后由 ddid 于 2009-8-8 02:05 PM 编辑 ]
页:
[1]
2