北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 6965|回复: 14

我也发个求助贴——DLL编译,duno帮忙看看?

[复制链接]
发表于 2009-8-8 01:08:37 | 显示全部楼层 |阅读模式
这两天研究把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
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-8-8 02:12:40 | 显示全部楼层
我也去装了下,选择download方式,不行啊。这个东西有什么好处?
gcc装个虚拟机不就有了吗。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-8-8 02:12:43 | 显示全部楼层
你用的linux?dll是windows的东西。
如果在linux下,就用linux的连接库格式编译
但是linux下应该也用不到cygwin
迷惑
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 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 编辑 ]
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 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有关。


不知我解释清楚了没?囧
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2009-8-8 04:48:57 | 显示全部楼层
原帖由 duno 于 2009-8-8 03:02 发表
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了!
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2009-8-8 06:25:35 | 显示全部楼层
郁闷死了,编译出来的dll在lua中不能被调用……
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 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
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2009-8-8 12:39:09 | 显示全部楼层
duno辛苦了

massage duno

我再试试……
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2009-8-8 13:55:15 | 显示全部楼层
发现了Gammon的另一个帖子,MUSH的lua和lua.org的好像有点区别:
http://www.gammon.com.au/forum/?id=7795

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

[ 本帖最后由 ddid 于 2009-8-8 02:05 PM 编辑 ]
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-24 07:34 PM , Processed in 0.011178 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表