2012-01-20 42 views
14

Khi sử dụng clang ++, làm thế nào tôi có thể làm cho CMake sử dụng cờ -std=c++0x khi biên dịch, nhưng không phải khi liên kết?CMake clang và C++ 0x

Có một số bài viết khác liên quan đến việc sử dụng clang làm trình biên dịch, nhưng tôi không tìm thấy bất kỳ gợi ý nào về việc đặt tiêu chuẩn C++.

Đây là những gì tôi đã cố gắng:

CMakeLists.txt:

project(test) 
add_executable(main main.cxx) 

ClangOverride.txt:

SET (CMAKE_C_FLAGS_INIT    "-Wall -std=c99") 
SET (CMAKE_C_FLAGS_DEBUG_INIT   "-g") 
SET (CMAKE_C_FLAGS_MINSIZEREL_INIT  "-Os -DNDEBUG") 
SET (CMAKE_C_FLAGS_RELEASE_INIT  "-O3 -DNDEBUG") 
SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g") 

SET (CMAKE_CXX_FLAGS_INIT    "-Wall -std=c++0x -stdlib=libc++") 
SET (CMAKE_CXX_FLAGS_DEBUG_INIT   "-g") 
SET (CMAKE_CXX_FLAGS_MINSIZEREL_INIT  "-Os -DNDEBUG") 
SET (CMAKE_CXX_FLAGS_RELEASE_INIT  "-O3 -DNDEBUG") 
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g") 
SET (CMAKE_EXE_LINKER_FLAGS_INIT   "") 

main.cxx:

int main(){ return 0; } 

lệnh sử dụng để gọi cmake

CC=clang CXX=clang++ cmake .. -DCMAKE_USER_MAKE_RULES_OVERRIDE=ClangOverride.txt -DCMAKE_BUILD_TYPE=Release 

Xây dựng dự án:

VERBOSE=1 make 

này sẽ gọi hai lệnh sau:

/usr/bin/clang++ -Wall -std=c++0x -stdlib=libc++ -O3 -DNDEBUG -o CMakeFiles/main.dir/main.cxx.o -c /tmp/asdf/main.cxx 
/usr/bin/clang++ -Wall -std=c++0x -stdlib=libc++ -O3 -DNDEBUG CMakeFiles/main.dir/main.cxx.o -o main -rdynamic 

Lệnh kết quả thứ hai trong cảnh báo vì nếu lá cờ chưa sử dụng: -std = C++ 0x

clang: warning: argument unused during compilation: '-std=c++0x' 
CMakeFiles/main.dir/main.cxx.o: file not recognized: File format not recognized 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Làm cách nào để tránh điều này?

+0

Hmm, AFAIK, CMake không nên sử dụng trình điều khiển trình biên dịch để liên kết các tệp đối tượng. Điều 'CMAKE_USER_MAKE_RULES_OVERRIDE' là gì? – arrowd

Trả lời

10

Sử dụng ADD_DEFINITIONS ("- std = C++ 0x") thay vì đặt cờ CXX.

+3

nếu một số mã sử dụng trình biên dịch C thì sao? – Timothy003

+1

Nếu bạn không muốn tùy chọn này xuất hiện trong mục tiêu C, bạn phải đặt nó trong CMAKE_CXX_FLAGS. – belkiss

+0

Đây là gì? Tôi phải đặt nó ở đâu? –