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
- имело ли смысл использовать -02 вместо -03 ?
- Как удалить -03 из флагов?
- для чего используется 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 )