2013-11-23 2 views
4

Я пытаюсь написать CMakeFiles.txt (никогда не делал этого раньше), и я не уверен, какой флаг компилятора использовать для C++ 11. Я использую GCC 4.8.2, а флаг - std = C++ 0x, но я не уверен, что делать с другими компиляторами. Я не думаю, что все они используют этот флаг, я считаю, что MinGW-TDM использует std = C++ 11, что бы правильный способ гарантировать, что компилятор использует C++ 11?Флаги компилятора для C++ 11

+2

Правильный флаг для GCC 4.8. * Is -std = C++ 11'. Что касается других компиляторов, вам придется проконсультироваться со своими документами - универсального способа нет. – Angew

+1

Связанные? http://stackoverflow.com/q/10851247/420683 – dyp

+0

Хм, я использовал -std = C++ 0x в своих файлах make-файлов, и он работает. Я попробую предложения в этом потоке DyP, но я думаю, мне нужно будет найти документы для msvc и llvm. Спасибо, парни. – Mike

ответ

3

В моем проекте я просто пытаюсь добавить -std = C++ 11, и если это не работает, я пытаюсь -std = C++ 0x. Когда оба терпят неудачу, я просто оставлю это в покое. Для меня это отлично работает, но я никогда не пробовал компилятор Windows. Вот пример кода:

# test for C++11 flags 
include(TestCXXAcceptsFlag) 

if(NOT DISABLE_GXX0XCHECK) 
    # try to use compiler flag -std=c++11 
    check_cxx_accepts_flag("-std=c++11" CXX_FLAG_CXX11) 
endif(NOT DISABLE_GXX0XCHECK) 

if(CXX_FLAG_CXX11) 
    [add flag -std=c++11 where needed] 
else() 
    if(NOT DISABLE_GXX0XCHECK) 
    # try to use compiler flag -std=c++0x for older compilers 
    check_cxx_accepts_flag("-std=c++0x" CXX_FLAG_CXX0X) 
    endif(NOT DISABLE_GXX0XCHECK) 
    if(CXX_FLAG_CXX0X) 
    [add flag -std=c++11 where needed] 
... 

Mabye stackoverflow.com/q/10984442 действительно помогает вам. Эрик Шёлунд предлагает взглянуть на FindCXXFeatures.cmake в ночной сборке CMake.

Редактировать: Я пробовал это с Visual C++ Microsoft, и у моего решения есть недостаток: компилятор выдает предупреждение о непризнанном флаге. Это означает, что CMake определяет флаг как правильный и добавляет его. Таким образом, вы получаете это предупреждение для каждого исполняемого файла. Добавление -Werror, или что-то вроде флага для Visual C++, должно помочь.

1

Вы должны установить свои флаги вручную для каждого компилятора вы таргетирования:

IF (CMAKE_COMPILER_IS_GNUCXX) 
    SET (CMAKE_CXX_FLAGS "-std=gnu++11") 
ELSEIF (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 
    SET (CMAKE_CXX_FLAGS "-std=c++11") 
ELSEIF (MSVC) 
    # On by default 
ENDIF() 

в качестве, например.

+0

Для clang вам также может понадобиться '-stdlib = libC++' –

0

С предстоящим выпуском CMake 3.1.0 (теперь доступным как кандидат на выпуск 2) новый способ заключается в использовании команды CMake target_compile_features, чтобы указать, какие C++ features используются. CMake из этой информации убедится, что компилятор C++ вызывается с правильными флагами командной строки (например, -std = C++ 11).

Например, эта программа C++ с именем файла main.cc позволяет использовать функции C++: cxx_strong_enums, cxx_constexpr, cxx_auto_type

#include <cstdlib> 

int main(int argc, char *argv[]) { 
    enum class Color { Red, Orange, Yellow, Green, Blue, Violet }; 
    constexpr float a = 3.1415f; 
    auto b = a; 
    return EXIT_SUCCESS; 
} 

Этот CMakeLists.txt файл будет построить его

cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR) 
project(foobar CXX) 
add_executable(foobar main.cc)                                                              
set(needed_features 
    cxx_strong_enums 
    cxx_constexpr 
    cxx_auto_type) 
target_compile_features(foobar PRIVATE ${needed_features}) 

As (21 ноября 2014 года) версия CMake версии 3.1.0 еще не выпущена. Он теперь доступен как кандидат на выпуск 2. Обратите внимание: эта функциональность еще не была выпущена в стабильном выпуске CMake, поэтому, я думаю, используйте это только в том случае, если вам нравится экспериментировать.

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