如何在 windows 上的 cmake 中添加编译标志?
How to add compile flags in cmake on windows?
我使用 CMake(使用 ninja 和 Visual Studio 2017 C++ 编译器)写了一个项目,有两个模块 lib_A
和 lib_B
lib_B
取决于一个 lib_A
.
lib_B
和 lib_A
都定义了 std::vector < size_t >
。
最后,编译器告诉我:LNK2005 lib_A: std::vector < size_t > already defined in lib_B
我搜索了答案,他们给出了添加 link 标志 /FORCE:MULTIPLE
、page1 and page2.
的解决方案
我尝试了所有这些,但是 none 有效。
使用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
- 使用
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"
- 使用
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 运行时,或者使用静态运行时,但也将两个库构建为静态库。
我使用 CMake(使用 ninja 和 Visual Studio 2017 C++ 编译器)写了一个项目,有两个模块 lib_A
和 lib_B
lib_B
取决于一个lib_A
.lib_B
和lib_A
都定义了std::vector < size_t >
。
最后,编译器告诉我:LNK2005 lib_A: std::vector < size_t > already defined in lib_B
我搜索了答案,他们给出了添加 link 标志 /FORCE:MULTIPLE
、page1 and page2.
我尝试了所有这些,但是 none 有效。
使用
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
- 和
- 使用
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"
- 和
- 使用
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 运行时,或者使用静态运行时,但也将两个库构建为静态库。