CMake, g++: установить флаги CXX -02, но -03 все еще есть?

Я думаю, что хочу добавить определенные флаги компилятора cxx в режим выпуска. Я читал здесь в другом потоке, что -O2-хорошие флаги для конфигурации выпуска

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -O2")

но если я проверю сейчас флаги CXX

message(${CMAKE_CXX_FLAGS_RELEASE})

написать мне

-O3 -DNDEBUG -Wall -O2
  1. имело ли смысл использовать -02 вместо -03 ?
  2. Как удалить -03 из флагов?
  3. для чего используется DNDEBUG?

С наилучшими пожеланиями

3 ответов


используйте документацию компилятора, чтобы увидеть разницу между O2 и O3 и сделать свой выбор (например - gcc. здесь вы можете найти рекомендацию использовать O2 для стабильность.


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

macro(remove_cxx_flag flag)
  string(REPLACE "${flag}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endmacro()

[использование]

  macro(remove_cxx_flag flag)
    string(REPLACE "${flag}" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
  endmacro()

  message(${CMAKE_CXX_FLAGS_RELEASE}) # print "-O3 -DNDEBUG"
  remove_cxx_flag("-O3")
  message(${CMAKE_CXX_FLAGS_RELEASE}) # print "-DNDEBUG"

здесь используется макрос, потому что вам нужно обновить переменную из родительской области, прочитайте эту - http://www.cmake.org/cmake/help/v2.8.10/cmake.html#command:macro (или вы можете использовать функцию с модификатором PARENT_SCOPE)


NDEBUG используется для отключения утверждаю см. для чего используется макрос препроцессора NDEBUG (на разных платформах)? для получения дополнительной информации.


${val} ссылается на переменную.

код set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -O2")

добавляет ранее настроенные переменные CMAKE_CXX_FLAGS_RELEASE.

поэтому измените его на

set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -Wall -O2")

-DNDEBUG удаляет assert из вашего кода-пропускает его. Больше на http://en.cppreference.com/w/cpp/error/assert


изменение флагов

если вы хотите переопределить значение по умолчанию CMAKE_C_FLAGS_RELEASE или CMAKE_CXX_FLAGS_RELEASE переменная CMAKE_BUILD_TYPE release который расположен на -O3 -DNDEBUG вам нужно будет сделать это до project линии. По сути, если значения по умолчанию типа сборки release вам не подходят, вам нужно взять дело в свои руки. Дополнительная возможность-справиться с этим в CMAKE_TOOLCHAIN_FILE

cmake_minimum_required( VERSION 3.8 )

set( CMAKE_C_FLAGS_DEBUG "" CACHE STRING "" )       
set( CMAKE_CXX_FLAGS_DEBUG "" CACHE STRING "" )
set( CMAKE_C_FLAGS_RELEASE "" CACHE STRING "" )
set( CMAKE_CXX_FLAGS_RELEASE "" CACHE STRING "" )

project(hello)

set( SOURCE_FILES
    hello.c foo.c )

add_executable( hello
    ${SOURCE_FILES} )


set_source_files_properties( foo.c 
    PROPERTIES
    COMPILE_FLAGS "-O3 -DNDEBUG" )

set_source_files_properties( hello.c 
    PROPERTIES
    COMPILE_FLAGS -O0 )