2014-10-31 92 views
3

首先的日食,我已經檢查不同的解決方案:配置與C++ 11

Threads std::system_error

Threads std::system_error II

Compile multithreading with gcc

Bug gcc multithreading

我的環境:

Ubuntu的1404 64bits的

GCC 4.8.2

的Eclipse IDE爲C/C++開發

版本:露娜服務版本1(4.4.1) 版本ID:20140925-1800

繼這些鏈接之後,我設法編譯並運行了一個基本的線程程序(代碼是從SO中的一個鏈接中獲取的,但是無法再次找到它。如果有人看到它,請編輯我的問題以添加參考)。

#include <iostream> 
#include <thread> 
#include <vector> 

void func(int tid) 
{ 
    std::cout << "Launched by thread " << tid << std::endl; 
} 

int main() 
{ 
    std::vector<std::thread> th; 

    int nr_threads = 10; 
    for(int i = 0; i < nr_threads; ++i) 
    { 
     th.push_back(std::thread(func, i)); 
    } 

    for(auto &t : th) 
    { 
     t.join(); 
    } 

    return 0; 
} 

我用它來編譯它的命令是以下(這個工程和輸出文件是可執行文件):

g++ --std=c++11 -pthread test.cpp -o test.out

Launched by thread 1 
Launched by thread 5 
Launched by thread 3 
Launched by thread 6 
Launched by thread 4 
Launched by thread 0 
Launched by thread 7 
Launched by thread 8 
Launched by thread 9 
Launched by thread 2 

問題是,當我嘗試設置我的eclipse項目。我可以編譯,但它不能產生有效的可運行輸出。

編譯日誌:

12:09:45 **** Incremental Build of configuration Debug for project test **** 
make all 
Building file: ../test.cpp 
Invoking: GCC C++ Compiler 
g++ --std=c++11 -pthread -D__cplusplus=201103L -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"test.d" -MT"test.d" -o "test.o" "../test.cpp" 
Finished building: ../test.cpp 

Building target: test 
Invoking: GCC C++ Linker 
g++ -o "test" ./test.o 
Finished building target: test 


12:09:46 Build Finished (took 780ms) 

我是爲製造商改變不同的設置,方言......因爲他們在試圖讓相同的命令,我可以使用從終端編譯鏈接說。但沒有辦法從eclipse創建一個有效的輸出文件。它總是顯示此錯誤:

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

不知道如何設置偏食?

更新:@Dirk我在虛擬機測試的適應症和它的作品只是增加了並行線程的連接庫。

但對於我的初始設置它仍然失敗。我修改C/C++構建設置G ++連接器命令後,它的工作原理爲g++ --std=c++0x -pthread

因此,看起來很明顯,我的第一個環境缺少一些東西。

+0

如何在工作中執行鏈接示例?看起來像eclipse被配置爲使用-pthread進行編譯,但不用於鏈接。 – Dirk 2014-10-31 11:30:25

+0

我沒有更改g ++鏈接器設置中的任何內容。當我添加標誌-pthread時,它會拋出make:***沒有規則來製作target -pthread,這是測試所需要的。停止.'建立時 – blfuentes 2014-10-31 11:33:49

+0

只需在鏈接器設置的庫選項下添加pthread即可。 – Dirk 2014-10-31 11:44:48

回答

1

似乎缺少與pthread庫的鏈接。在Build-> Settings-> Tool Settings-> GCC C++ Linker-> Libraries下添加「pthread」。

這是我的生成日誌說:

**** Build of configuration Debug for project testpthreads **** 

make all 
Building file: ../main.cpp 
Invoking: GCC C++ Compiler 
g++ -O0 -g3 -Wall -c -fmessage-length=0 --std=c++0x -pthread -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp" 
Finished building: ../main.cpp 

Building target: testpthreads 
Invoking: GCC C++ Linker 
g++ -o "testpthreads" ./main.o -lpthread 
Finished building target: testpthreads 

你的代碼工作和輸出:

Launched by thread Launched by thread Launched by thread 1 
Launched by thread 0 
Launched by thread 2 
Launched by thread 9 
Launched by thread 3 
Launched by thread 7 
Launched by thread 6 
4 
Launched by thread 8 
5 

我得到同樣的錯誤,你沒有-lpthread

我的鏈接器設置: linkersettings

+0

正如我在你的評論中回答的。儘管鏈接器現在檢查-lpthread,但仍然是相同的錯誤。 – blfuentes 2014-10-31 11:52:53

+0

我會再次檢查。您能否發佈鏈接器設置的屏幕截圖? – blfuentes 2014-10-31 13:54:54

+0

這可能確實是一個問題,你的具體設置:( – Dirk 2014-10-31 14:08:16