2012-10-15 22 views
6

Nie mogę uzyskać scons, aby poprawnie skompilować przykład małego wątku (na Linux).C++ kompilować przykład std :: wątek ze scons

Jeśli biegnę scons, robi to:

[email protected]:~/projects/c++_threads$ scons 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
g++ -o build/main.o -c -std=c++11 -pthread -Wall -g src/main.cpp 
g++ -o build/c++threads build/main.o 
scons: done building targets. 

wtedy, gdy biegnę ./build/c++threads zgłasza ten błąd:

terminate called after throwing an instance of 'std::system_error' 
    what(): Operation not permitted 
Aborted 

Jeśli mogę skompilować z wiersza poleceń z tym:

g++ -std=c++11 -pthread -Wall -g src/main.cpp 

kompiluje się do a.out, a jeśli uruchomię a.out to ru ns program (wykonuje niektóre wyniki dla wątków itp.).

Oto mój plik SConstruct:

# Tell SCons to create our build files in the 'build' directory 
VariantDir('build', 'src', duplicate=0) 

# Set our source files 
source_files = Glob('build/*.cpp', 'build/*.h') 

# Set our required libraries 
libraries = [] 
library_paths = '' 

env = Environment() 

# Set our g++ compiler flags 
env.Append(CPPFLAGS=['-std=c++11', '-pthread', '-Wall', '-g']) 

# Tell SCons the program to build 
env.Program('build/c++threads', source_files, LIBS = libraries, LIBPATH = library_paths) 

i oto plik cpp:

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

//This function will be called from a thread 

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

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

    int nr_threads = 10; 

    //Launch a group of threads 
    for (int i = 0; i < nr_threads; ++i) { 
     th.push_back(std::thread(func,i)); 
    } 

    //Join the threads with the main thread 
    for(auto &t : th){ 
     t.join(); 
    } 

    return 0; 
} 

Ktoś ma jakiś pomysł co robię źle ???

Doceń każdą pomoc!

Cheers

Jarrett

+3

Nie musisz również dodawać opcji '-pthread' do flag łącznika? –

+1

@JoachimPileborg Jeśli łączenie i kompilacja odbywa się w dwóch etapach, tak. – inf

Odpowiedz

5

Dzięki @Joachim i @bamboon za komentarze. Dodanie pthread do flag linkera (biblioteki scons) zadziałało.

nowego pliku SCons jest teraz:

# Tell SCons to create our build files in the 'build' directory 
VariantDir('build', 'src', duplicate=0) 

# Set our source files 
source_files = Glob('build/*.cpp', 'build/*.h') 

# Set our required libraries 
libraries = ['pthread'] 
library_paths = '' 

env = Environment() 

# Set our g++ compiler flags 
env.Append(CPPFLAGS=['-std=c++11', '-pthread', '-Wall', '-g']) 

# Tell SCons the program to build 
env.Program('build/c++threads', source_files, LIBS = libraries, LIBPATH = library_paths) 

Jeszcze raz dziękujemy!

+0

Uwaga: Możesz także zaakceptować własną odpowiedź, aby pokazać, że rozwiązała problem. – inf

+0

Najwyraźniej muszę poczekać 2 dni, zanim będę mógł przyjąć własną odpowiedź: \ – Jarrett