加法假設@ FelixPalmen的答案。 pthread
可以按照gcc的規範聲明傳遞給鏈接器。 gcc可以使用內置的規格或從文件中讀取。
實驗
默認情況下,在我的系統鏈接打印錯誤,而我嘗試建立樣品不-lpthreads
:
[email protected]:~$ gcc ./thread.c -o thread
/tmp/ccHgCRzO.o: In function `main':
thread.c:(.text+0x29): undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status
首先我發現which files gcc tries to use as spec:
[email protected]:~$ strace gcc 2>&1 | grep spec
access("/usr/lib/gcc/i686-linux-gnu/5/specs", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/i686-linux-gnu/5/../../../../i686-linux-gnu/lib/i686-linux-gnu/5/specs", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/i686-linux-gnu/5/../../../../i686-linux-gnu/lib/specs", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/i686-linux-gnu/specs", R_OK) = -1 ENOENT (No such file or directory)
然後創建我自己的規格getting build-in one並將其放入上一步獲得的路徑:
[email protected]:~$ sudo gcc -dumpspecs >/usr/lib/gcc/i686-linux-gnu/5/specs
我插入逐個-lpthread
成Spec文件的*link:
,*lib:
和*libgcc:
部分。在所有情況下,海灣合作委員會可以建立程序,而無需明確提及pthread庫:
[email protected]:~$ gcc ./thread.c -o thread && echo "completed"
completed
Gotcha !!!
檢測,如果GCC使用任何附加的規格文件
需要看接下來的輸出(I用gcc-5.1.0):
[email protected]:~$ gcc -v 2>&1 | head -1
檢測是否有並行線程的連接是默認
需要看到裏面得到規範文件的-lpthread
任何外觀與鏈接器相關的部分。
Spec file reference
注意'pthread'是怎樣的一個特殊* *庫,正確的參數'gcc'是'-pthread',不'-lpthread'。仍然有趣的問題。 –
根據@ FelixPalmen的回答,最好給出一個示例代碼,可以重現這個問題 - 當沒有給出'-pthread'選項時,不存在編譯器/鏈接器錯誤。請從'gcc --version'提交您正在使用的GCC版本,因爲這些細節是特定於實現的。它也可能取決於你使用的是哪個版本的glibc。 –
使用'gcc -v -Wall homework.c'來找出'gcc'在做什麼... –