在gcc中放置`-l'选项

时间:2011-12-23 04:08:08

标签: linux gcc

使用-l时,我在放置gcc选项时遇到问题。这是一个用于重现问题的简化版本。

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放到最后才能使其正常工作?而且似乎这个问题只发生在32位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的位置很重要”。究竟是什么意思?

1 个答案:

答案 0 :(得分:5)

来自manual

  

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

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

进一步反思,我认为问题在于--as-needed标志,默认情况下可能在您的gcc 4.6系统中开启。有关讨论,请参阅此link