【问题标题】:How to change a compiler flag for just one executable in CMake?如何在 CMake 中仅更改一个可执行文件的编译器标志?
【发布时间】:2014-08-05 23:56:27
【问题描述】:

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

由于只是项目构建的众多可执行文件之一,我需要将 \MP 标志设置为 false(或禁用它,因为我在导入 .tlb 文件时遇到错误),我该如何设置标志这个目标不一样?

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

我应该给 cmake 一些 set_target_properties 还是专门从整个项目中删除标志? 谢谢!

【问题讨论】:

标签: c++ visual-studio-2010 compiler-construction cmake


【解决方案1】:

您可以使用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( MYPROPS myprogram.cpp COMPILE_FLAGS )
STRING( REPLACE "/MP1" "" MYPROPS ${MYPROPS} )
set_source_files_properties( myprogram.cpp COMPILE_FLAGS ${MYPROPS} )

但是,我建议将源文件一分为二。一个包含所有带有 \MP 标志的源文件,另一个仅包含 myprogram.cpp

【讨论】:

  • 抱歉,我误读了您的问题,并认为您想专门为单个文件或目标设置属性。我会更新我的答案...
  • 空字符串替换对我不起作用(CMake 错误:“set_source_files_properties 调用的参数数量不正确”),我不得不使用空格:STRING( REPLACE "/MP1" " " MYPROPS ${MYPROPS} )
  • 你知道如何避免被替换后的警告:D9025 : overriding '/GR-' with '/GR'
【解决方案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 的魅力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    相关资源
    最近更新 更多