Как изменить флаг компилятора только для одного исполняемого файла в CMake?
У меня есть проект CMake, который поддерживает множественную компиляцию процессора в Visual Studio с помощью флага \MP
.
Так как только в одном из многих исполняемых файлов, которые строят проект, мне нужно установить флаг \MP
в false (или отключить его, потому что я получаю ошибки, импортирующие файл .tlb
), как я могу установить флаги для эта цель отличается?
add_executable(MyProgram myprogram.cpp)
target_link_libraries(MyProgram MyLibraries)
Должен ли я дать некоторые set_target_properties
для cmake или специально удалить флаг из всего проекта?
Спасибо!
Ответы
Ответ 1
Вы можете использовать set_source_files_properties, чтобы добавить COMPILE_FLAGS для myprogram.cpp. Например:
add_executable(MyProgram myprogram.cpp)
# Add the -std=c++11 flag as an example
set_source_files_properties( myprogram.cpp PROPERTIES COMPILE_FLAGS "-std=c++11" )
target_link_libraries(MyProgram MyLibraries)
Если вам нужны эти флаги для всех исходных файлов в цели MyProgram, вы можете использовать set_target_properties с целевым свойством COMPILE_FLAGS:
add_executable(MyProgram myprogram.cpp)
# Add the -std=c++11 flag as an example
target_link_libraries(MyProgram MyLibraries)
set_target_properties( MyProgram PROPERTIES COMPILE_FLAGS "-std=c++11" )
Обновление: чтобы удалить одно свойство, вы можете сначала получить все свойства и вручную удалить флаг обидчика из списка. Например, с помощью get_source_file_property:
get_source_file_property( MYPROPS myprogram.cpp COMPILE_FLAGS )
STRING( REPLACE "/MP1" "" MYPROPS ${MYPROPS} )
set_source_files_properties( myprogram.cpp COMPILE_FLAGS ${MYPROPS} )
Тем не менее, я бы рекомендовал разделить ваши исходные файлы на две части. Один со всеми исходными файлами с флагом \MP, а другой только с myprogram.cpp
Ответ 2
Новый подход
# Simply add the opposite flag to the target
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
target_compile_options(${TARGET_NAME} PRIVATE "/GR")
else()
target_compile_options(${TARGET_NAME} PRIVATE "-frtti") # works even if -fno-rtti is set to CXX_FLAGS
endif()
Старый подход:
Вы можете отключить его, сначала удалив флаг из флагов компилятора по умолчанию, чем установить его на свою цель. В моем случае я хотел удалить разрешение RTTI, потому что он был отключен по умолчанию:
function(enable_RTTI target_name)
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
set(NO_RTTI "/GR-")
set(WITH_RTTI "/GR")
else()
set(NO_RTTI "-fno-rtti")
endif()
string(REPLACE "${NO_RTTI}" "${WITH_RTTI}" COMPILE_FLAGS_RTTI_ENABLED "${CMAKE_CXX_FLAGS}")
set_target_properties(${target_name} PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS_RTTI_ENABLED}")
endfunction()
...
# Do this on your specific target
enable_RTTI(${TARGET_NAME}
Это работает как шарм с CMake 3!