Как изменить флаг компилятора только для одного исполняемого файла в 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!