2013-02-27 53 views
5

我在Fedora 17(使用GCC)上使用eclipse,並且在pthread_create()上有一個未定義的引用,即使包含pthread.h,並且在gcc構建命令行上有-lpthread。 ..pthread庫undefined參考

這裏是我的代碼,以防萬一

void* repair() 
{ 
    int var; 
    for (var = 0; var < NB_ITER ; var += 2) 
    { 
     printf("PAIR : %d\n", var); 
    } 

return NULL; 
} // pair 

void exo03() 
{ 
    pthread_t id1; 
    pthread_create(&id1, NULL, &repair, NULL); 
} 

謝謝你的幫助:)

+1

您可能忘記了您與pthread庫的鏈接。在你的編譯命令中加上'-lpthread'作爲最後一個。 – 2013-02-27 15:04:36

+0

你能提供一個完整的編譯器命令+錯誤的例子和精確記錄嗎? – simonc 2013-02-27 15:05:21

回答

8

在Linux,FreeBSD(和一些其他的* nix口味),你應該使用編譯器選項-pthread而不是試圖與一個pthread庫鏈接。

對於eclipse

Eclipse是未配置爲把-pthread參數在GCC編譯 。爲了解決這個問題,轉到菜單:

項目 - >屬性

C/C++編譯 - > GCC C編譯器 - >其他

添加「-pthread」的說法到開頭的「其它標誌」

還請到:

C/C++編譯 - >設置 - > GCCç鏈接 - >庫

,幷包括「並行線程「圖書館進入其他圖書館。點擊應用並重建項目 。 Pthreads現在必須工作。

man gcc

-pthread:增加了與pthreads庫支持多線程。此選項爲預處理器和鏈接器設置標誌。

我發現了一個explanation here

在GCC中,-pthread(又名-pthreads)選項,同時管理編譯 預處理器/和/連接器,使編譯與POSIX線程。 預處理器將定義/啓用/使用POSIX線程的一些 宏版本(或執行條件編譯,以使POSIX線程 邏輯),以及鏈接器將特異性針對的libpthread鏈接所得到的對象

然而,-lpthread只需告訴連接嘗試解決針對libpthread庫的任何 外部引用,在-lm告訴鏈接以嘗試解決針對libm庫的任何外部 引用同樣的方式 。對於-lpthread,你的代碼可能 不包含外部引用的libpthread,即使你寫的Posix 線程的代碼,因爲關鍵的宏尚未開啓。

+0

爲什麼不鏈接到libpthread? – 2013-02-27 15:05:03

+0

@ bash.d:因爲沒有'-pthread'選項,compîler和鏈接器將無法找到正確的pthread庫:) – 2013-02-27 15:15:41

+0

好的,謝謝,我已經忘記了這個! – 2013-02-27 15:16:53

4

你鏈接到libpthread?

$> gcc ... -lpthread