2011-12-23 36 views
3

使用gcc時,我在安裝-l選項時遇到了一些問題。這是一個精簡版,用於重現問題。在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到底,使其工作?而且似乎這個問題只發生在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的位置是顯著」。這究竟意味着什麼?

+0

這取決於鏈接器上的最多。如果你可以爲兩個系統做'ld --version',那可能會更有啓發性。 – 2011-12-23 05:19:22

回答

5

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