免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6672 | 回复: 5
打印 上一主题 下一主题

链接lua静态库出错,帮忙阿 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-22 21:18 |只看该作者 |倒序浏览
用nm 查看库liblua.a 函数明明就在那里
00000e98 T luaL_loadfile
为什么gcc  calllua.c -Lmyluadir -llua仍然出错

/tmp/ccfdyd0o.o(.text+0xf3): In function `main':
: undefined reference to `luaL_loadfile'

另外myluadir路径没错,因为去掉-Lmyluadir 则提示找不到lua库

论坛徽章:
0
2 [报告]
发表于 2009-01-22 22:26 |只看该作者
是不是连接器尝试找的是共享库,而你只有静态库
所以应该采用静态链接方式啊,gcc 增加-static选项
我只是随便说说的,自己也不是很清楚

顺便关注一下

论坛徽章:
0
3 [报告]
发表于 2009-01-23 11:29 |只看该作者
搞定!

gcc -I/home/lua-5.1.4/src  -L/home/lua-5.1.4/src -llua -lm calllua.c -o calllua
改成
gcc calllua.c -o calllua -I/home/lua-5.1.4/src  -L/home/ua-5.1.4/src -llua  -lm
即可
gcc 对参数的顺序也有要求?

论坛徽章:
0
4 [报告]
发表于 2009-01-23 12:01 |只看该作者
原来是这样啊
c专家编程 第五章对链接的思考  一章中提到这个问题了

在  与提取动态库中的符号相比,静态库中的符号提取的方法限制更严 一节中,提到了动态链接和静态链接使用存在的一点差别

在动态链接中,所有的库符号进入输出文件的虚拟地址空间中,所有的符号对于链接在一起的所有文件都是可见的
相反,对于静态链接,在处理archive时,它只是在archive中查找载入器当时所知道的未定义符号

所以在你的这个例子中,
gcc  -llua -lm calllua.c
因为在处理-llua的时候,它前面并没有发现luaL_loadfile这个未定义符号的出现,所以它没有把它加载进来,在处理callua.c的时候就出错了

把-llua -lm放在源文件callua.c的后面 编译就不报错了,这是因为gcc在处理callua.c时候,发现了未定义符号luaL_loadfile,在接下来的处理中,它会在-llua所链接的库中找到luaL_loadfile,所以就不报错了
gcc calllua.c  -llua  -lm

所以,书上给了一个温馨小提示
始终将 -l函数库 选项放在编译命令行的最右边

[ 本帖最后由 zhuhefang2006 于 2009-1-23 12:10 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-01-24 00:10 |只看该作者
[quot]用nm 查看库liblua.a 函数明明就在那里[/quot]

强烈建议LZ看下动态库和静态库的区别啊。

-l 链接的是动态库

如果链接静态库,可以-static(不一定100%管用),一般直接把 liblua.a 文件直接当成个 *.o 文件和你的 *.c 文件放一起编译就可以了。

gcc /home/ua-5.1.4/src/libua.a calllua.c -o calllua -I/home/lua-5.1.4/src  -lm

论坛徽章:
0
6 [报告]
发表于 2009-03-20 14:57 |只看该作者

回复 #4 zhuhefang2006 的帖子

强,顶你一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP