我编译一个项目并在我的系统上运行它,它确实很好。哪个链接器选项包含gcc
我上传到git,并要求我的管理员在服务器上运行它,它说undefined reference to 'clock_gettime'
。此错误可通过链接库与-lrt
选项解决。我之前发生过类似的问题,但这与链接math.h
库和-lm
选项的帮助有关。
有没有办法找到所有链接的库,这样就不会遇到这样的问题,也不会在管理员面前感到尴尬。如何确定所有链接的库。这可以有一个思考过程吗?
我编译一个项目并在我的系统上运行它,它确实很好。哪个链接器选项包含gcc
我上传到git,并要求我的管理员在服务器上运行它,它说undefined reference to 'clock_gettime'
。此错误可通过链接库与-lrt
选项解决。我之前发生过类似的问题,但这与链接math.h
库和-lm
选项的帮助有关。
有没有办法找到所有链接的库,这样就不会遇到这样的问题,也不会在管理员面前感到尴尬。如何确定所有链接的库。这可以有一个思考过程吗?
一些man
页面将提及应使用的标题和库。 (遗憾的是,并非所有页面都如此。)
例如,请看man 3 signal
。在我的系统上,页面顶部有LIBRARY
部分,Standard C Library (libc, -lc)
,然后是SYNOPSIS
部分,其中#include <signal.h>
。
其他一些策略包括:
布朗特使用strings
在shell循环管道输送到egrep
,搜索已安装的图书馆之一名称的引用。这可能会为通用名称返回很多误报,但对于不匹配单个英语单词的精心设计的函数名称来说,它非常有效。
迭代编译和链接。如果您试图解析单个函数,请编写一个调用该函数的小程序,并使用shell或makefile循环来测试系统上的每个单独的库(从/usr/lib
或其他位置的最可能候选人的小列表开始)。在某个时候,构建会成功并向您展示正确的库。此方法需要一些工作来设置,但您创建的基础架构在将来也很容易重用。
使用链接器的工具迭代检查二进制文件(例如,Mac OS X上的otool
或Solaris或Linux上的objdump
或readelf
)。例如,尝试从特定名称(Mac OS X上的otool -v -t -p _symbol
)开始反汇编库的文本部分。
对于基于* nix的计算机,ldd
上的可执行文件将打印共享库依赖项。
这只是为了知识,明确包含这些链接器标志是明智的做法吗? –
@AmanDeepGautam是一个问题吗? –
如果是这样,我会说最好告诉管理员明确地链接每个不是标准库的库。这样,只要连接器可以解决问题,就可以保证它可以正常工作。 –
那些不是链接器*选项* - 那些只是*库*。您需要包含您使用的那些库。你的文档会告诉你这些是什么。 –