linux下编译C源文件链接库顺序问题

寻找Python之禅 2011-11-01 07:42:37
今天在编译一个C可执行程序时,连接啦两个自定义静态库,在这两个库里都有一个相同名称的函数,参数列表也完全一样,只有函数体内容有些许区别。执行可执行程序后发现结果不是想要的。后来把两个静态库的属性对调啦一下,再次执行可执行程序后就得到啦想要的结果。 编译时是如何确定使用两个库中相同名称的函数中的哪一个的?请求各位高人给以解答,另希望高人们传授这方面的详细知识,谢谢!
...全文
346 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lengxujun 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 seucs 的回复:]
在gcc中,静态库的链接是按照你给的 -l 选项的顺序从左往右依次扫描的,你想要连接函数要放在最左边,如 liba 里面有一个 void hello(); 函数, libb 里面也有一个函数原型和 liba一模一样的函数,如果你需要调用的是 liba 中的,则给的链接顺序应为: -la -lb ,即 liba在前
若你想要链接libb里面的hello函数,则应将链接选项的顺序写为: -lb -l……
[/Quote]

更详细的细节可参考ld文档:
http://sourceware.org/binutils/docs/ld/index.html
柯本 2011-11-01
  • 打赏
  • 举报
回复
新版的gcc中,缺省情况下,重复定义是要报错的
multiple definition of 'xxx'
但ld有个选项,--allow-multiple-definition充许重复定义.
在gcc中可以这样写
gcc -Wl,--allow-multiple-definition ...
库/源文件/.o文件的编译/连接顺序为从左到右
也说是说连接时,从左边开始,只要找到合适的函数,就先会加入程序
seucs 2011-11-01
  • 打赏
  • 举报
回复
在gcc中,静态库的链接是按照你给的 -l 选项的顺序从左往右依次扫描的,你想要连接函数要放在最左边,如 liba 里面有一个 void hello(); 函数, libb 里面也有一个函数原型和 liba一模一样的函数,如果你需要调用的是 liba 中的,则给的链接顺序应为: -la -lb ,即 liba在前
若你想要链接libb里面的hello函数,则应将链接选项的顺序写为: -lb -la,即 libb在前
qq120848369 2011-11-01
  • 打赏
  • 举报
回复
这个不重定义就不错了。

69,322

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧