Как добавить флаги компиляции в cmake на windows? - PullRequest
1 голос
/ 19 сентября 2019

Я написал проект с использованием 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 .

Я пробовал все это, но ни один из них не работает.


  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

Использование 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, компиляторговорит мне аналогичный результат.

Может ли кто-нибудь мне помочь?Добавляет ли флаг ссылки какую-либо ошибку?

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Вы можете использовать target_link_options в CMake ≥ 3.13 или set_target_properties со свойством LINK_FLAGS ранее.

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

При этом также используются выражения генератора , чтобы применять флаг только для MSVC.

Но похоже, что обе ваши библиотеки являются общими (DLL), но вы статически связываете среду выполнения с обеими.Я не думаю, что это хорошая идея.

Попробуйте либо динамически связать среду выполнения для обеих библиотек, если вы хотите динамически ссылаться на них, либо использовать статическую среду выполнения, но также собрать обе библиотеки как статическую библиотеку.

0 голосов
/ 19 сентября 2019

Добавление следующей строки работало для меня:

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