2012-01-20 3 views
14

При использовании clang ++, как я могу заставить CMake использовать флаг -std=c++0x при компиляции, но не при связывании?CMake clang and C++ 0x

Существует несколько других сообщений, касающихся использования clang как компилятора, но я не нашел никаких намеков на настройку стандарта C++.

Вот что я пробовал:

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; } 

Команда используется для invoke cmake

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

Создание проекта:

VERBOSE=1 make 

Это будет вызывать следующие две команды:

/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 

Вторые результаты команды в предупреждение, потому что если флаг оон используемый: -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) 

Как я могу избежать этого?

+0

Hmm, AFAIK, CMake не должен использовать драйвер компилятора для связывания объектных файлов. Что такое 'CMAKE_USER_MAKE_RULES_OVERRIDE' вещь? – arrowd

ответ

10

Используйте ADD_DEFINITIONS ("- std = C++ 0x") вместо установки флагов CXX.

+3

Что делать, если какой-то код использует компилятор C? – Timothy003

+1

Если вы не хотите, чтобы этот параметр отображался в объектах C, вы должны установить его в CMAKE_CXX_FLAGS. – belkiss

+0

Что это? Где я должен это выразить? –

Смежные вопросы