如何在CMake中为单个可执行文件更改编译器标志?

16

我有一个CMake项目,通过\MP标志在Visual Studio中支持多处理器编译。

由于在该项目构建的众多可执行文件中只需要在一个可执行文件中将\MP标志设置为false(或禁用它,因为导入.tlb文件时出现错误),那么我该如何为此目标设置不同的标志呢?

add_executable(MyProgram myprogram.cpp)
target_link_libraries(MyProgram MyLibraries)

我应该给CMake一些set_target_properties还是从整个项目中特别删除标志?谢谢!


相关内容,请参见为单个文件覆盖编译标志 - jww
可能是CMake - 删除单个翻译单元的编译标志的重复问题。 - Cris Luengo
2个回答

18

您可以使用set_source_files_properties为myprogram.cpp添加COMPILE_FLAGS。例如:

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

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。


1
抱歉,我误读了您的问题,并认为您想要为单个文件或目标设置属性。我会更新我的答案... - André
一个空字符串替换对我没有起作用(CMake错误:“set_source_files_properties调用了不正确数量的参数”),我不得不使用一个空格:STRING(REPLACE“/ MP1”“”MYPROPS $ {MYPROPS}) - anno
1
你知道如何避免替换后出现警告:D9025: 用 '/GR' 覆盖 '/GR-'吗? - jaques-sam

4

新方法

# 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中运行得很好!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接