【问题标题】:Placement of `-l' option in gcc在 gcc 中放置 `-l' 选项
【发布时间】:2011-12-23 04:08:08
【问题描述】:

在使用gcc 时,我在放置-l 选项时遇到了一些问题。这是重现问题的精简版。

t.c:

#include <pthread.h>

int main() {
    pthread_create(0, 0, 0, 0);
}

在终端:

$ gcc -lpthread t.c  
/tmp/ccmkwV7B.o: In function `main':  
t.c:(.text+0x29): undefined reference to `pthread_create'  
collect2: ld returned 1 exit status

$ gcc t.c -lpthread  
$ (compiles ok)

为什么我必须把-lpthread放在最后才能让它工作?而且似乎这个问题只发生在 32bit linux 上。

我的环境信息附在下面:
gcc -lpthread t.c 在这台机器上失败。

$ gcc --version  
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1  

$ uname -rm  
3.0.0-12-generic i686

gcc -lpthread t.c 在这台机器上工作。

$ uname -rm  
2.6.18-274.3.1.el5 x86_64  

$ gcc --version  
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51)  

我查阅了 gcc 手册,上面说“-l 的位置很重要”。究竟是什么意思?

【问题讨论】:

  • 这主要取决于链接器。如果你可以为这两个系统做ld --version,那可能会更有启发性。

标签: linux gcc


【解决方案1】:

来自manual

在命令的哪个位置编写此选项会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,foo.o -lz bar.o 在文件foo.o 之后但在bar.o 之前搜索库z。如果bar.o 引用了z 中的函数,则这些函数可能不会被加载。

这意味着链接库首先在 gcc 4.1.2 上工作非常有趣。这可能与编译器链接的默认库有关。我知道在某些安装中我不需要显式链接到 pthread。

进一步思考,我认为问题在于标志--as-needed,它可能在您的 gcc 4.6 系统中默认启用。请参阅此link 进行一些讨论。

【讨论】:

    猜你喜欢
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多