我编译了一个项目并在我的系统上运行它,它做得很好。
我将它上传到 git 并要求我的管理员在服务器上运行它,它说undefined reference to 'clock_gettime'
. 可以通过使用-lrt
选项链接库来解决此错误。之前我也遇到过类似的问题,但这与在选项math.h
的帮助下链接库有关。-lm
有没有办法找到要链接的所有库,这样您就不会遇到此类问题,也不会在管理员面前感到尴尬。如何决定要链接的所有库。可以有一个思考过程吗?
我编译了一个项目并在我的系统上运行它,它做得很好。
我将它上传到 git 并要求我的管理员在服务器上运行它,它说undefined reference to 'clock_gettime'
. 可以通过使用-lrt
选项链接库来解决此错误。之前我也遇到过类似的问题,但这与在选项math.h
的帮助下链接库有关。-lm
有没有办法找到要链接的所有库,这样您就不会遇到此类问题,也不会在管理员面前感到尴尬。如何决定要链接的所有库。可以有一个思考过程吗?
对于基于 *nix 的机器,ldd
可执行文件将打印共享库依赖项。
有些man
页面会提到应该使用的标题和库。(不幸的是,并非所有页面都如此。)
例如,查看man 3 signal
. 在我的系统上,该页面LIBRARY
的顶部有一个部分Standard C Library (libc, -lc)
,后面是一个SYNOPSIS
部分#include <signal.h>
。
其他一些策略包括:
在 shell 循环中直接使用strings
piped toegrep
在已安装的库中搜索对名称的引用。这可能会为常用名称返回大量误报,但对于与单个英文单词不匹配的复杂函数名称非常有效。
迭代编译和链接。如果您尝试解析单个函数,请编写一个调用该函数的小程序,并使用 shell 或 makefile 循环来测试系统上的每个单个库(从最有可能来自/usr/lib
其他地方或其他任何地方的候选库开始)。在某个时候,构建会成功并向您展示正确的库。这种方法需要一些工作来设置,但是您创建的基础架构也很容易在将来重用。
使用链接器的工具(例如otool
,在 Mac OS Xobjdump
或readelf
Solaris 或 Linux 上)反复检查二进制文件。例如,尝试从特定名称(otool -v -t -p _symbol
在 Mac OS X 上)开始反汇编库的文本部分。