注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云淡风轻

云淡风轻近午天,傍花随柳过前川。

 
 
 

日志

 
 

[lua]编写c模块  

2012-12-16 22:56:56|  分类: 笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
照着《programming in lua》的例子把代码写好,编译成dll,在解析器里却死活不能用。经过一番google和bing之后,终于解决,记录之。

1. 环境:lua用的是5.2.1,在mingw上用gcc编译。make mingw && make install

2. 代码:书里的26章的代码。因为要编译成dll,所以要加上 __declspec(dllexport)

3. 编译:

$ gcc -shared -I /f/lua-5.2.1/src/ -L /f/lua-5.2.1/src/ mylib.c -o mylib.dll -llua

生成了mylib.dll在当前目录下。

然后就出现:

Lua 5.2.1 Copyright (C) 1994-2012 Lua.org, PUC-Rio
> require("mylib")
multiple Lua VMs detected
stack traceback:
[C]: in ?
[C]: in function 'require'
stdin:1: in main chunk
[C]: in ?

4. 原因:

因为静态链接了liblua.a,所以把lua虚拟机也带到mylib.dll里了。

5. 解决:

只要改成动态链接就行了,但是没有.lib文件。看lua的Makefile里也没有可以编译出lib文件的。只好从dll生成lib了。

基本办法就是用dumpbin导出符号表,然后用lib根据符号表生成lib。

f:> dumpbin /exports lua52.dll > lua52.def
f:> lib /def:lua52.def /OUT:lua52.lib /machine:x86

这样就生成了lib文件了。dumpbin里生成的内容很多,要编辑一下生成的文件,只保留导出函数的函数名。第一行加上EXPORTS。搜索一下create lib from dll,有很多教程的。注意的是.def的文件名要和.dll的一样,默认只找和def文件同名的dll。

然后再编译:

gcc -shared -I /f/360Downloads/lua-5.2.1/src/ -L /f/360Downloads/lua-5.2.1/src/ mylib.c lua52.lib -o mylib.dll

就可以用了:

Lua 5.2.1 Copyright (C) 1994-2012 Lua.org, PUC-Rio
> require("mylib")
> mylib.dir()

如果还不行,可能要参考这个链接,在编译参数里加上-DLUA_DL_DLL,然后重新编译一下lua。


[update]

其实不用这么麻烦,直接把dll和c文件一起编译就可以了。[lua]编写c模块 - 隐湖之鲤 - 云淡风轻

$ gcc -shared -I /f/lua-5.2.1/src/ -L /f/lua-5.2.1/src/ mylib.c /f/lua-5.2.1/src/lua52.dll -o mylib.dll

[完]

  评论这张
 
阅读(2603)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017