2012-08-15 39 views
8

OS X 1.8cmake, Clang và C++ v11 trên 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; 
} 

Lỗi của tôi:

$ 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 

Vì vậy, phiên bản của Clang không hỗ trợ tính năng C++ v11? Chương trình này tương tự không biên dịch theo gcc-4.7.1 trên OSX 10.8

tài liệu tham khảo này nói nó nên làm việc http://www.cpprocks.com/a-comparison-of-c11-language-support-in-vs2012-g-4-7-and-clang-3-1/

Tôi đang làm gì sai?

+1

Bạn đã thêm '-std = C++ 11-stdlib = libC++ 'vào cờ biên dịch? –

Trả lời

23

Bạn cần cung cấp các cờ -std=c++11-stdlib=libc++ cho trình biên dịch để kích hoạt hoàn toàn hỗ trợ C++ 11 của nó. Điều này có thể được thực hiện thông qua ccmake (bật chế độ nâng cao (với t), và thiết lập CMAKE_CXX_FLAGS để -std=c++11 -stdlib=libc++), hoặc thông qua một chỉ thị tương đương trong CMakeLists.txt của bạn:

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

Cảm ơn: 'set (CMAKE_CXX_FLAGS" -std = C++ 11 -stdlib = libC++ ") ' – Jason

+1

Điều đó vẫn không hiệu quả. Các tùy chọn được chuyển đến trình biên dịch, "làm cho VERBOSE = 1" đã xác minh điều đó, nhưng các lớp C++ 11 như std :: thread hoặc std :: function không được xác định, mặc dù có được bao gồm. – Michael

+0

@Michael bạn đã tìm thấy giải pháp chưa? – aledalgrande

Các vấn đề liên quan