我编译一个项目并在我的系统上运行它,它完全没问题。
我将其上传到git,并要求我的管理员在服务器上运行它并显示undefined reference to 'clock_gettime'
。通过使用-lrt
选项链接库可以解决此错误。我之前发生过类似的问题,但这与在math.h
选项的帮助下链接-lm
库有关。
有没有办法找到所有要链接的库,这样就不会遇到这样的问题,也不会在管理员面前感到尴尬。如何确定要链接的所有库。可以有一个思考过程吗?
答案 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上的objdump
或readelf
)迭代检查二进制文件。例如,尝试从特定名称(Mac OS X上的otool -v -t -p _symbol
)开始反汇编库的文本部分。