ddid 发表于 2009-8-8 01:08:37

我也发个求助贴——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

muxiao 发表于 2009-8-8 02:12:40

我也去装了下,选择download方式,不行啊。这个东西有什么好处?
gcc装个虚拟机不就有了吗。

duno 发表于 2009-8-8 02:12:43

你用的linux?dll是windows的东西。
如果在linux下,就用linux的连接库格式编译
但是linux下应该也用不到cygwin
迷惑

duno 发表于 2009-8-8 03:02:06

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 编辑 ]

ddid 发表于 2009-8-8 04:36:19

看来俺说的不是很清楚……

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有关。


不知我解释清楚了没?囧

ddid 发表于 2009-8-8 04:48:57

原帖由 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

ddid 发表于 2009-8-8 06:25:35

郁闷死了,编译出来的dll在lua中不能被调用……

duno 发表于 2009-8-8 12:32:27

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

ddid 发表于 2009-8-8 12:39:09

duno辛苦了

massage duno

我再试试……

ddid 发表于 2009-8-8 13:55:15

发现了Gammon的另一个帖子,MUSH的lua和lua.org的好像有点区别:
http://www.gammon.com.au/forum/?id=7795

看起来还是我的cygwin编译得有问题?……yct12

[ 本帖最后由 ddid 于 2009-8-8 02:05 PM 编辑 ]
页: [1] 2
查看完整版本: 我也发个求助贴——DLL编译,duno帮忙看看?