2012-06-28 48 views
2

我编译一个项目并在我的系统上运行它,它确实很好。哪个链接器选项包含gcc

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

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

+0

那些不是链接器*选项* - 那些只是*库*。您需要包含您使用的那些库。你的文档会告诉你这些是什么。 –

回答

1

一些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上的objdumpreadelf)。例如,尝试从特定名称(Mac OS X上的otool -v -t -p _symbol)开始反汇编库的文本部分。

1

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

+0

这只是为了知识,明确包含这些链接器标志是明智的做法吗? –

+0

@AmanDeepGautam是一个问题吗? –

+0

如果是这样,我会说最好告诉管理员明确地链接每个不是标准库的库。这样,只要连接器可以解决问题,就可以保证它可以正常工作。 –