2013-12-22 49 views
0

這項工作:編譯錯誤的gcc -lpthread位置

gcc a.o b.o -o a -lpthread 

這不起作用:

gcc -lpthread a.o b.o -o a 

,並顯示一些象這樣的錯誤:

undefined reference to `pthread_create' 

所以,當我使用編譯生成文件,它生成

gcc -lpthread a.o b.o -o a 

哪個不行。

任何想法?

PS:我用gcc 4.6.3/Ubuntu的12.04

回答

2

首先,您要使用-pthread,不-lpthread,與並行線程編譯時 - -pthread可以使一些所需要的編譯時間選項該計劃在多線程環境下工作。

問題不在於您的命令行 - 這是GNU ld的問題。 GNU ld,在遇到一個-lXXX選項,讀取由libXXX.solibXXX.a定義的所有符號,檢查是否有任何這些符號已在已在命令行的-lXXX選項之前被指定的文件被提到,而忘記有關其餘的符號。

換句話說:目標文件和庫的命令行順序改變了鏈接器的行爲。

當計算機的內存真的很有限時,這可能是合理的,但現在它只是一個被遺忘時間很久的愚蠢的人爲因素,而這個應該在前一段時間已經被解決了。

當然,可能會出現與定義相同符號的多個庫鏈接的問題,但肯定有更爲方便的方法來允許這種情況下的預期行爲。


底線:對於GNU ld(由gcc調用),只是從你的問題的第一個命令是有效的,因爲ld仍住在以前的計算時代。

爲了獲得額外的正確性,請在鏈接時使用-pthread編譯您的pthread相關程序。

+0

謝謝你。在更改爲-pthread之後,它可以工作,而不管選項的位置。 –

+0

我想'-pthread'增加了一個特殊的情況來鏈接它。這證明了我的觀點,即現在的期權訂單不再好。 – Griwes