在gcc中放置`-l'选项

dac*_*ngy 3 linux gcc

-l在使用时放置选项有些麻烦gcc.这是一个用于重现问题的精简版本.

TC:

#include <pthread.h>

int main() {
    pthread_create(0, 0, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)

在终端:

$ 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)
Run Code Online (Sandbox Code Playgroud)

为什么我必须-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
Run Code Online (Sandbox Code Playgroud)

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)  
Run Code Online (Sandbox Code Playgroud)

我查阅了gcc手册,它说"-l的位置很重要".究竟是什么意思?

Chr*_*ley 5

手册,

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

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

经过进一步的反思,我认为问题在于标志--as-needed,默认情况下可能在你的gcc 4.6系统中.有关讨论,请参阅此链接.