如何在 windows 上的 cmake 中添加编译标志?

How to add compile flags in cmake on windows?

我使用 CMake(使用 ninja 和 Visual Studio 2017 C++ 编译器)写了一个项目,有两个模块 lib_Alib_B

最后,编译器告诉我:LNK2005 lib_A: std::vector < size_t > already defined in lib_B

我搜索了答案,他们给出了添加 link 标志 /FORCE:MULTIPLEpage1 and page2.

的解决方案

我尝试了所有这些,但是 none 有效。


  1. 使用target_link_libraries

    • target_link_libraries(lib_B lib_A INTERFACE "/FORCE:MULTIPLE")
    • 编译器告诉我 The INTERFACE, PUBLIC or PRIVATE option must appear as the second argument, just after the target name.

    • target_link_libraries(lib_B INTERFACE "/FORCE:MULTIPLE" lib_A )

    • 编译器告诉我 ninja: error: '/FORCE:MULTIPLE', needed by 'lib_B', missing and no known rule to make it

  1. 使用CMAKE_EXE_LINKER_FLAGS
    • set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "/FORCE:MULTIPLE")
    • 编译告诉我 LINK : warning LNK4012: value “x64;/FORCE:MULTIPLE” is invalid, must be one of "ARM, EBC, HYBRID_X86_ARM64X64, or X86" omit this option"

  1. 使用set_target_properties 使用 CMake 代码
get_target_property(TEMP lib_B COMPILE_FLAGS)
if(TEMP STREQUAL "TEMP-NOTFOUND")
  SET(TEMP "") # Set to empty string
else()
  SET(TEMP "${TEMP} ") # A space to cleanly separate from existing content
endif()
# Append our values
SET(TEMP "${TEMP} /FORCE:MULTIPLE" )
set_target_properties(lib_B PROPERTIES COMPILE_FLAGS ${TEMP} )

编译器告诉我cl: command line error D8021 : invalid parameter "/FORCE:MULTIPLE"


如果我将 /FORCE:MULTIPLE 更改为 -Wl,--allow-multiple-definition,编译器会告诉我类似的结果。

有人能帮帮我吗? 添加 link 标志是否有任何错误?

添加以下行对我有用:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /FORCE:MULTIPLE") 

您可以在 LINK_FLAGS 属性 之前使用 target_link_options in CMake ≥ 3.13 or set_target_properties

target_link_options(${PROJECT_NAME} PUBLIC $<$<CXX_COMPILER_ID:MSVC>:/FORCE:MULTIPLE>)

这也使用 generator expressions 仅应用 MSVC 的标志。

但是您的两个库似乎都是共享的 (DLL),但是您静态地 link 将运行时设置为两者。 我不认为这是个好主意。

如果您想动态 link 两个库,请尝试动态地 link 运行时,或者使用静态运行时,但也将两个库构建为静态库。