2013-10-14 91 views
5

您好,我在C++ 11中遇到線程問題。我有Ubuntu的64位13.10(測試)與G + + 4.8.1。 我試圖編譯代碼:C++ 11線程錯誤運行時間

#include <thread> 

void func() 
{ 
    // do some work 
} 

int main() 
{ 
    std::thread t(func); 
    t.join(); 
    return 0; 
} 

與選項:-std = C++ 11 -pthread -lpthread。編譯成功,但是當我試圖運行它,我收到了一個錯誤:

terminate called after throwing an instance of 'std::system_error'
what(): Enable multithreading to use std::thread: Operation not permitted

+0

你可以用-pthread -std = C++ 11試試嗎? (沒有-lpthread) – sphair

+1

似乎其他人有這個問題https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1228201 – log0

回答

2

看來秩序問題,或者至少,這就是在此跟帖說: C++ Threads, std::system_error - operation not permitted?

+1

正確。我從來不知道爲什麼_exactly_,但這個解釋它:http://stackoverflow.com/questions/18827938/strange-g-linking-behavior-depending-on-arguments-order基本上,如果你使用'-lwhatever' _before_需要該庫的文件,鏈接器會丟棄它,因爲它沒有看到目前使用的任何符號。 – stefan

+0

yes鏈接庫必須位於需要它的文件的右側。但是它真的是OP的問題嗎?似乎其他人在Ubuntu 13.10上遇到同樣的問題。 – log0

6

我認爲其他答案有點誤導。重要的是你只需要-pthread這個的標誌是不是重要!

-pthread會自動鏈接libpthread,它會正確地做到這一點。請注意,您需要在編譯時提供和連接這兩個選項(當然,除非您一次做所有事情)。

只有當您明確提供-lpthread時,放置位置的順序可能很重要,但如前所述,使用-pthread時不應明確添加。

+0

在這種情況下使用'-pthread'不會有幫助。我有相同的環境,唯一的解決方案是[this](http://stackoverflow.com/a/19359353/476681) –