g 編譯thread問題

2021-10-16 21:15:22 字數 900 閱讀 3379

linux下測試std::thread,在編譯完成後,執行程式的時候,提示以下問題

terminate called after throwing an instance of 'std::system_error'

what(): enable multithreading to use std::thread: operation not permitted

aborted

剛開始以為是程式在linux下許可權的問題,賦予777許可權後,並未得到解決,

原來,問題原因在於,在linux中要用到多執行緒時,需要鏈結pthead庫。編譯的時候加上命令 -pthread。

為了可移植性,在linux中,pthread是作為乙個單獨的庫存在的(libthread.so),但在其它unix變種中卻不一定。比如在freebsd中是沒有單獨的pthread庫的,因此在freebsd中不能使用-lpthread來鏈結pthread,而使用-pthread則不會存在這個問題,因為freebsd的編譯器能正確將-pthread展開為該系統下的依賴引數。同樣道理,其他不同的變種也會有這樣那樣的區別,如果使用-lpthread,則可能在移植到其他unix變種中時會出現問題,為了保持較高的可移植性,我們最好還是使用-pthread(儘管這種做法未被接納成為c標準,但已基本是事實標準)。

新增額外的標誌:在多數系統中,-pthread會被展開為「-d_reentrant -lpthread」,即是除了鏈結pthread庫外,還先定義了巨集_reentrant。定義這個巨集的目的,是為了開啟系統標頭檔案中的各種多執行緒支援分支。比如,我們常常使用的錯誤碼標誌errno,如果沒有定義_reentrant,則實現為乙個全域性變數;若是定義了_reentrant,則會實現為每執行緒獨有,從而避免執行緒競爭錯誤。

g 編譯的小問題

在編譯時,對於靜態連線庫,老是報錯。如,我現在有個靜態庫,名字為 libdig.a 本來編譯的時候,寫的是 g o test l.ldig test.c 老是不成功。把 ldig 拿到後面就行了。g o test l.test.c ldig 其實,想想也是,只有在編譯的時候才會去連線它。所以得把它們...

g 編譯總結

一 編譯注意細節 1.使用g 編譯cpp檔案如果用gcc編譯c 原始檔時,加以下選項 lstdc 否則使用了c 操作的檔案編譯會出錯。2.gcc g 在執行編譯時,需要4步 預處理,生成.i的檔案 使用 e引數 將預處理後的檔案不轉換成組合語言,生成檔案.s 使用 s引數 有彙編變為目標 機器 生成...

Thread引數傳遞問題

一 類的普通成員函式作為thread的引數 class threadtest threadtest 類的普通成員函式 void test fun1 int num threadtest tt thread th1 threadtest test fun1,tt,10 th1.join 二 類的靜態成...