哪些链接器选项包含gcc

时间:2012-06-28 02:00:32

标签: c gcc linker linker-errors

我编译一个项目并在我的系统上运行它,它完全没问题。

我将其上传到git,并要求我的管理员在服务器上运行它并显示undefined reference to 'clock_gettime'。通过使用-lrt选项链接库可以解决此错误。我之前发生过类似的问题,但这与在math.h选项的帮助下链接-lm库有关。

有没有办法找到所有要链接的库,这样就不会遇到这样的问题,也不会在管理员面前感到尴尬。如何确定要链接的所有库。可以有一个思考过程吗?

2 个答案:

答案 0 :(得分:1)

对于基于* nix的计算机,可执行文件上的ldd将打印共享库依赖项。

答案 1 :(得分:1)

有些man页面会提到应该使用的标头和库。 (不幸的是,所有页面都不是这样。)

例如,请查看man 3 signal。在我的系统中,该网页的顶部有LIBRARY部分Standard C Library (libc, -lc),后面跟SYNOPSIS部分#include <signal.h>

其他一些策略包括:

  • 在shell循环中直接使用strings管道传递给egrep,以搜索已安装库中名称的引用。这可以为常用名称返回很多误报,但对于与单个英语单词不匹配的复杂函数名称,它可以很好地工作。

  • 迭代编译和链接。如果您正在尝试解析单个函数,请编写一个调用该函数的小程序,并使用shell或makefile循环来测试系统中的每个单独的库(从/usr/lib的最可能候选者的小列表开始,或者无论在哪里)。在某些时候,构建将成功并向您显示正确的库。此方法需要一些设置,但您创建的基础架构在将来也很容易重用。

  • 使用链接器的工具(例如Mac OS X上的otool或Solaris或Linux上的objdumpreadelf)迭代检查二进制文件。例如,尝试从特定名称(Mac OS X上的otool -v -t -p _symbol)开始反汇编库的文本部分。