xirurensheng_123
xirurensheng_123
采纳率56.3%
2016-09-05 07:35 阅读 1.4k
已采纳

请问下编译的链接静态库或者共享库使用-l选项的时候问题

2

想请教下,为什么在Makefile中其放在目标文件后边使用的时候没有问题,为什么放在目标文件前边就提示要使用的静态库
或者共享库中的函数不存在

前提libadd.a是存在的
比如编译生成main程序:
gcc -L 库文件所在路径 -ladd main.o -o main
这样使用提示我要体用libadd.a中的add函数未引用
如果我将-ladd 放在main的后边就不报错

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

2条回答 默认 最新

  • 已采纳
    hijack00 hijack00 2016-09-05 10:57

    gcc的连接选项是有顺序的,应该将最被依赖的选项放到最后,这样才不容易出现undefined reference to xx之类的错误。经验是将-l开头的选项放到命令行的末尾,这样不容易出问题

    点赞 1 评论 复制链接分享
  • oyljerry oyljerry 2016-09-05 10:17

    这是跟GCC的自己的bug

    The problem isn't really with your command line - it's a problem with GNU ld. GNU ld, upon encountering an -lXXX option, reads all the symbols defined by libXXX.so or libXXX.a, checks if any of those symbols have been mentioned in files that have been specified before the -lXXX option in the command line, and forgets about the rest of the symbols.

    In other words: command line order of object files and libraries changes behavior of the linker.

    点赞 评论 复制链接分享

相关推荐