error: cannot find -lpthread


通過arm-linux-androideabi-gcc 出現“cannot find -lpthread”錯誤,

解決方案:

-lpthread替換為-pthread

 

附:-pthread 與 -lpthread區別

 

一般情況下,我們在鏈接一個(文件名為libxxx.so或libxxx.a等的)庫時,會使用-lxxx的方式;在Linux中要用到多線程時,需要鏈接pthread庫,按照慣例,我們應該使用-lpthread的方式來進行鏈接;但是,通過日常的觀察,我發現很多開源代碼都是使用了-pthread參數,而非使用-lpthread,這是為什么呢?

一通Google后,總算找到一些線索:

  1. 為了可移植性:在Linux中,pthread是作為一個單獨的庫存在的(libpthread.so),但是在其他Unix變種中卻不一定,比如在FreeBSD中是沒有單獨的pthread庫的,因此在FreeBSD中不能使用-lpthread來鏈接pthread,而使用-pthread則不會存在這個問題,因為FreeBSD的編譯器能正確將-pthread展開為該系統下的依賴參數。同樣道理,其他不同的變種也會有這樣那樣的區別,如果使用-lpthread,則可能在移植到其他Unix變種中時會出現問題,為了保持較高的可移植性,我們最好還是使用-pthread(盡管這種做法未被接納成為C標准,但已基本是事實標准)。
  2. 添加額外的標志:在多數系統中,-pthread會被展開為“-D_REENTRANT -lpthread”,即是除了鏈接pthread庫外,還先定義了宏_REENTRANT。定義這個宏的目的,是為了打開系統頭文件中的各種多線程支持分支。比如,我們常常使用的錯誤碼標志errno,如果沒有定義_REENTRANT,則實現為一個全局變量;若是定義了_REENTRANT,則會實現為每線程獨有,從而避免線程競爭錯誤。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM