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.

Другие вопросы по тегам