Я написал проект с использованием CMake (с ниндзя и компилятором 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
Я искал ответы, и они давалирешение добавить флаг ссылки /FORCE:MULTIPLE
, page1 и page2 .
Я пробовал все это, но ни один из них не работает.
Использование 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
, компиляторговорит мне аналогичный результат.
Может ли кто-нибудь мне помочь?Добавляет ли флаг ссылки какую-либо ошибку?