2011-07-15 37 views
0

當我嘗試在Fedora中使用多線程編譯C程序時,出現以下錯誤。使用Fedora上的線程編譯C函數的問題

文件名是abc.c

abc.c:(.text+0x39): undefined reference to `pthread_create' 
abc.c:(.text+0x61): undefined reference to `pthread_create' 
abc.c:(.text+0x79): undefined reference to `pthread_join' 
abc.c:(.text+0x8d): undefined reference to `pthread_join' 

我檢查在/ usr/include和我發現pthread.h存在。我也嘗試將pthread.h複製到與abc.c相同的目錄中

如何解決這些鏈接錯誤?

+5

gcc -o myexe abc.c -lpthread ??? – George

回答

3

正如指出的喬治,你必須使用線程庫鏈接 的gcc -o ABC abc.c -pthread 您收到這些錯誤的原因是因爲在鏈接階段,編譯器試圖填補所有插槽哪裏它已經爲方法調用放置了佔位符,它知道它已經被定義,但目前不知道它們的位置,因爲相應的庫尚未鏈接。正如caf在編譯和鏈接階段中使用-pthread標誌所指出的那樣,編譯器可以更明智地選擇在某些情況下需要使用哪些線程安全。

+4

現代用法是爲編譯和鏈接階段提供'-pthread'(note - no'-l'),後者又要求連接必要的庫。這也允許編譯器以其他方式更改輸出以適應多線程代碼的生成。 – caf

+0

我通常編譯沒有-pthread標誌的gcc -c,但是當我使用-lpthread進行鏈接時,是否有區別?我猜如果它在編譯階段知道pthreads,它可以添加優化 –

+0

我認爲這取決於架構和C庫在使用中是否在編譯階段沒有運行。 – caf