CMAKE для /DEF и /NODEFAULTLIB
Как добавить флаги компоновщика "DEF" и "NODEFAULTLIB" в проект vs2012 через CMAKE?
1 ответ
Вы можете добавить их к CMAKE_EXE_LINKER_FLAGS
:
if(MSVC)
set(CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS} /DEF:my_defs.def /NODEFAULTLIB")
endif()
Общий способ - добавить флаги компоновщика в CMAKE_xxx_LINKER_FLAGS
, да. Однако в случаеCMAKE_SHARED_LINKER_FLAGS
а также /DEF:
параметр, есть особый случай, из-за которого у меня возникли проблемы.
Если вы уже используете CMAKE_EXPORT_ALL_SYMBOLS
(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
) тогда /DEF:
параметр не появится в команде связывания, даже если вы указали его в CMAKE_SHARED_LINKER_FLAGS
.
Это потому, что компоновщик MSVC принимает только один /DEF:
параметр, и CMake не хочет переопределять существующий: /DEF:<build_path>/exports.def
(который добавлен из-за CMAKE_EXPORT_ALL_SYMBOLS
) с тем, который вы указываете в CMAKE_SHARED_LINKER_FLAGS
.
Вы также можете использовать CMAKE_CXX_STANDARD_LIBRARIES
. Он добавляет произвольные флаги компоновщика без их проверки, но добавляет их в середину команды связывания перед/DEF:<build_path>/exports.def
так что последнее не будет отменено.
Полное обсуждение этого случая здесь: https://cmake.org/pipermail/cmake-developers/2019-November/031274.html.