首頁 >後端開發 >C++ >為什麼我的帶有靜態連結和 Pthread 的 C 程式會導致分段錯誤?

為什麼我的帶有靜態連結和 Pthread 的 C 程式會導致分段錯誤?

DDD
DDD原創
2024-10-26 11:14:021056瀏覽

Why Does My C   Program With Static Linking and Pthreads Result in a Segmentation Fault?

g 靜態鏈接Pthread 時,導致分段錯誤:解釋及解決方法

問題:

當使用g 和-pthread 標誌來靜態(-static)連結pthread 函式庫時,程式會遇到分段錯誤。

解釋:

  1. 弱符號:

      pth函數使用弱符號,例如pthread_mutex_lock()。
    • 連結時弱符號可以被強符號取代。
  2. 動態連結與靜態連結:

      動態連結連結時,將弱符號從共享庫中解析。
    • 在靜態連結中,連結器在第一個符號(包括弱符號)處停止,並且不搜尋強符號。
  3. 不完整的連結解析:

      使用-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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn