g 靜態鏈接Pthread 時,導致分段錯誤:解釋及解決方法
問題:
當使用g 和-pthread 標誌來靜態(-static)連結pthread 函式庫時,程式會遇到分段錯誤。
解釋:
-
弱符號:
pth函數使用弱符號,例如pthread_mutex_lock()。 - 連結時弱符號可以被強符號取代。
-
動態連結與靜態連結:
動態連結連結時,將弱符號從共享庫中解析。 - 在靜態連結中,連結器在第一個符號(包括弱符號)處停止,並且不搜尋強符號。
-
-
不完整的連結解析:
使用-static 時,連結器不會考慮pthread 庫中的所有符號,因為它首先遇到弱符號.- 因此,不使用pthread_mutex_lock() 的強符號。
-
解決方案:
到強制連結器在靜態連結程式中查看pthread 庫中的所有符號,使用:
g++ -o one one.cpp -Wall -std=c++11 -O3 -static -pthread \
-Wl,--whole-archive -lpthread -Wl,--no-whole-archive
登入後複製
- -Wl,--whole-archive: 包含所有物件指定檔案中的檔案。
- -lpthread: pthread 函式庫的連結。
- -Wl,--no-whole-archive:停用後續存檔的整個存檔選項。
附加說明:
某些系統可能需要附加標誌,例如librt 的-lrt .- 如果使用Autotools ,請在configure.ac 中定義標誌並在Makefile.am 中取代它們。例如:
-
以上是為什麼我的帶有靜態連結和 Pthread 的 C 程式會導致分段錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!