2010-01-05 562 views
10

我有以下測試程序。未定義的引用`pthread_mutex_trylock'

#include <iostream> 
#include <cstdlib> 

using namespace std;  
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER; 

int main(int argc, char *argv[]) 
{ 
    int iret; 
    iret = pthread_mutex_trylock(& mymutex); 
    cout << "Test2 !!! " << endl; 
    pthread_mutex_unlock(& mymutex); 
    return EXIT_SUCCESS; 
} 

如果我編譯它不添加並行線程庫我得到爲pthread_mutex_trylock未解決的錯誤的錯誤,但僅限於功能pthread_mutex_trylock。

如果我和pthread_mutex_trylock取代pthread_mutex_trylock程序編譯和運行過程中出現好也沒有-lpthread *選項。

如果我添加了-lpthraed選項編譯命令都運行良好 這個運行良好:$ G ++ test2.c中-o test2的-lpthread 這種警告沒有得到解決:$ G ++ test2.c中-o test2的

實施例誤差輸出: $克++ test2.c中-o TEST2 /tmp/ccU1bBdU.o:在功能main': test2.c:(.text+0x11): undefined reference to pthread_mutex_trylock」 collect2:LD返回1個退出狀態

如果我更換instructi on iret = pthread_mutex_trylock(& mymutex);

with iret = pthread_mutex_lock(& mymutex);程序編譯和運行沒有錯誤此外,如果並行線程libarry沒有添加到編譯命令 我知道這是正確的有未解決的錯誤,如果我沒有使用-lpthread選項,但爲什麼我不一樣未解決的錯誤也爲其他pthread_函數?

我使用Fedora的GCC 4.4.2 12

$ g++ --version 
g++ (GCC) 4.4.2 20091222 (Red Hat 4.4.2-20) 
Copyright (C) 2009 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

做一些有關於這個unreference僅pthread_mutex_trylock的含義一些建議嗎?

感謝您的幫助,恩佐

+5

這可能是一些特定於平臺的行爲,但爲什麼你甚至打擾?你應該與pthread鏈接,就這樣做。 – 2010-01-05 22:36:20

+0

mybe我仍然有學習的願望:) – enzo2 2010-01-07 19:28:58

+1

儘管如此,這個問題在像我這樣的情況下非常有用,在這種情況下,調用'pthread_mutex_lock()'被'pthread_mutex_trylock()'取代,導致事情無緣無故地中斷。 – foraidt 2013-06-17 13:56:57

回答

14

如果使用並行線程功能,你應該-lpthread鏈接對象文件,而不用擔心符號是否被包括在libc

這個背後的基本原理是said就是這樣的:前段時間,當使用線程的應用程序在沒有線程支持的系統上運行時,使用libc中的存根。在這樣的系統上,pthread_*功能鏈接到libc存根,返回的錯誤表明沒有線程功能。在「線程」系統上,它們與pthread庫鏈接並正常工作。

很明顯,pthread_mutex_trylock功能出現後,政策更改爲鏈接-lpthread。所以沒有存根。

+0

謝謝帕維爾,現在這個奇怪的行爲我很清楚。 regars,ebzo – enzo2 2010-01-07 19:23:47

+2

順便說一下,'-lpthread'不是可移植的,特別是老版本的BSD使用'libc_r',而不是'libpthread'。因此,'-pthread'更便於使用並且推薦使用。 – 2013-12-19 20:32:36

14

你應該用-pthread選擇執行這兩個編譯和鏈接,可移植。在某些系統上,編譯將添加特定標誌(例如,-D_REENTRANT),並指定-pthread

如果您好奇-pthread會對您的編譯和鏈接標誌執行什麼操作,請運行gcc -dumpspecs