2012-08-15 17 views
8

OS X 1.8CMAKE, Clang e C++ v11 su OS X 10.8

CMAKE 2.8.9

Clang $ clang -v Apple clang version 4.0 (tags/Apple/clang-421.10.60) (based on LLVM 3.1svn) Target: x86_64-apple-darwin12.0.0 Thread model: posix

CMakeLists.txt:

cmake_minimum_required (VERSION 2.8.9) 
project (Test) 
add_executable(Test main.cpp) 

main.cpp

//Create a C++11 thread from the main program 
#include <iostream> 
#include <thread> 

//This function will be called from a thread 
void call_from_thread() { 
    std::cout << "Hello, World!" << std::endl; 
} 

int main() { 
    //Launch a thread 
    std::thread t1(call_from_thread); 

    //Join the thread with the main thread 
    t1.join(); 

    return 0; 
} 

Il mio errore:

$ make 
Scanning dependencies of target Test 
[100%] Building CXX object CMakeFiles/Test.dir/main.cpp.o 
test/main.cpp:4:10: fatal error: 'thread' file not found 
#include <thread> 
    ^
1 error generated. 
make[2]: *** [CMakeFiles/Test.dir/main.cpp.o] Error 1 
make[1]: *** [CMakeFiles/Test.dir/all] Error 2 
make: *** [all] Error 2 

Quindi la versione di Clang non supporta le caratteristiche di C++ v11? Questo stesso programma si compila sotto gcc-4.7.1 su OSX 10.8

Questo riferimento dice che dovrebbe funzionare http://www.cpprocks.com/a-comparison-of-c11-language-support-in-vs2012-g-4-7-and-clang-3-1/

Che cosa sto facendo di sbagliato?

+1

Hanno aggiunto '-std = C++ 11 -stdlib = libC++ 'ai flag del compilatore? –

risposta

23

È necessario fornire i flag -std=c++11 e -stdlib=libc++ al compilatore per attivare completamente il supporto per C++ 11. Questo può essere fatto attraverso ccmake (attivare la modalità avanzata (con t), e impostare CMAKE_CXX_FLAGS a -std=c++11 -stdlib=libc++), o attraverso una direttiva equivalente nella tua CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.9) 
set(CMAKE_CXX_FLAGS "-std=c++11 -stdlib=libc++") 
project(Test) 
add_executable(Test main.cpp) 
+0

Grazie: 'set (CMAKE_CXX_FLAGS" -std = C++ 11 -stdlib = libC++ ") ' – Jason

+1

Ancora non funziona. Le opzioni vengono passate al compilatore, "make VERBOSE = 1" verificato, ma le classi C++ 11 come std :: thread o std :: function non sono definite, nonostante e siano incluse. – Michael

+0

@Michael hai trovato una soluzione? – aledalgrande