2012-03-10 82 views
2

我想對用於我的程序的pthread庫進行一些修改。這就是爲什麼我想鏈接自己修改的pthread庫。我可以在glibc中獲取pthread的源代碼,對其進行修改並將其用於我的程序。如何鏈接我自己的pthread庫

通常使用標誌-pthread與原pthread庫鏈接。如何在我的makefile中指定與我自己的庫鏈接。

+2

請參閱http://stackoverflow.com/questions/2127797/gcc-significance-of-pthread-flag-when-compiling – Christoph 2012-03-10 11:05:43

回答

2

-pthread相當於-lpthread -D_REENTRANT用gcc/glibc的。您可以做同樣的事情,但使用不同的鏈接參數(-lname-of-library)。

+1

您可以確認這是你的特定gcc版本。使用'gcc -dumpspecs | grep「%{pthread」'。 – 2012-03-10 11:27:18

+0

事實證明你並不是真的需要'-D_REENTRANT',也就是'-lname-of-library'應該足夠了 – Christoph 2012-03-10 11:48:02

4

只需使用-L選項指定自定義庫存在的目錄並使用-l選項指定庫的名稱。 對於防爆:

-L/root/x/mylib -lmypthread 

在這種情況下,你的lib名字應該libmypthread.so

參考http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html瞭解更多詳情。

要確保庫發現,當你執行你的程序加載,做

export LD_LIBRARY_PATH = $(LD_LIBRARY_PATH):/root/x/mylib 
+1

你可能會考慮將'-rpath'選項傳遞給鏈接器:'-Wl,-rpath $ MYLIB_DIR',如果我有正確的語法。 – 2012-03-10 11:34:10

0

在一個不同的名稱編譯庫,例如libmypthread.so並把它包含在你的LD_LIBRARY_PATH的目錄之一環境變量(或添加一個新目錄)。現在您可以使用-lmypthread鏈接到您的圖書館。

2

請勿使用-pthread。這是一個未公開的GCC選項,可能與其他一些(Solaris?)編譯器兼容。

-D_REENTRANT定義它-pthread使是在glibc的完全不必要;爲了線程安全,沒有頭文件依賴於這個宏。 (最後一個這樣的機制在1998年從glibc頭文件中刪除!)簡單地鏈接-lpthread就足以將glibc函數切換到線程安全模式,並且-lpthread可以用您自己的庫代替,就像其他答案所說的那樣。

+0

請參閱http://gcc.gnu.org/ml/gcc/2010-05/msg00062.html – Christoph 2012-03-10 11:46:09

+0

不幸的是,雖然事情*應該是*的方式,但它可能不適用於gcc。理論上,gcc應該使用POSIX不兼容的內存模型,因爲它可能會執行錯誤地在同步過程中錯誤移動訪問的優化,並且您需要'-pthread'或'-std = c11'來使其使用正確的內存模型。我從來沒有遇到一個重要的情況,但我記得在一個郵件列表或gcc bug跟蹤器上閱讀一個線索,這是gcc開發人員的態度,它可能涉及一個真正的bug ... – 2012-03-10 12:26:16

+0

哦,我記得現在的問題。它以更大的類型訪問內存,並影響位域。 gcc忽略位域上聲明的整數類型,並且通常以更大(例如64位)的加載/存儲操作執行讀取/修改/寫入循環,如果恰好與存儲器中的位域相鄰的數據可能是非常危險的被另一個線程(甚至是信號處理程序)訪問。假設'-pthread'禁用了這個行爲,現在可能有一個單獨的'-f'選項。有趣的是,這是破解的Linux *內核。 – 2012-03-10 12:29:28

相關問題