1. 程式人生 > >Linux下使用-static -lpthread靜態編譯出現段錯誤(Segmentation fault)

Linux下使用-static -lpthread靜態編譯出現段錯誤(Segmentation fault)

最近在看golang,感覺go的靜態編譯思想很不錯。於是準備把手頭的幾個專案靜態編譯一下,結果編譯的時候沒報任何警告及錯誤,一執行就報段錯誤(Segmentation fault)。gdb逐步除錯,發現問題出在std::thread那裡。仔細檢查了下所有語法,沒發現任何問題。關鍵是動態編譯一切正常,加了-static靜態編譯就會出現這個問題。
Google才發現這是一個bug,std::thread Segmentation fault static linking
解決方案有兩個:
1.引數加上

-Wl,--whole-archive -lpthread -Wl,--no-whole
-archive 如: g++ -std=c++11 -O3 -Wall -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive main.cpp -o test

2.用boost::thread代替std::thread。

注意: 此現象只會出現在debian系/SUSE系等Linux系統,紅帽系沒發現這個問題。