c++ c visual-studio-2010 linker cmake

c++ - Activando las banderas del enlazador con CMake



visual-studio-2010 linker (5)

El uso de la biblioteca "ucm" parece ser un buen enfoque. Presenté una macro simple que me ayudó a administrar de manera uniforme los indicadores de vinculador en CMake para todas las configuraciones y al mismo tiempo permitir el uso específico del compilador. (El solo hecho de configurar la variable puede hacer que las banderas se apilen cuando CMake se configura varias veces).

macro(ADD_MSVC_LINKER_FLAG flag) if(MSVC) if(${CMAKE_EXE_LINKER_FLAGS} MATCHES "(${flag}.*)") # message("skipping linker flags") else() set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE) endif() if(${CMAKE_SHARED_LINKER_FLAGS} MATCHES "(${flag}.*)") # message("skipping linker flags") else() set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE) endif() if(${CMAKE_STATIC_LINKER_FLAGS} MATCHES "(${flag}.*)") # message("skipping linker flags") else() set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE) endif() if(${CMAKE_MODULE_LINKER_FLAGS} MATCHES "(${flag}.*)") # message("skipping linker flags") else() set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE) endif() endif() endmacro()

Luego se admiten otros compiladores mediante la creación de una macro específica del compilador que verifica que el compilador esté en uso. Eso hace que sea más difícil establecer el indicador correcto en el compilador incorrecto.

if(CMAKE_COMPILER_IS_GNUCXX)

y

if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)

Al generar destinos VS2010 con CMake, me gustaría que el indicador / LTCG esté activado (solo para release + releasewithdebinfo si es posible, pero está bien si está activado para compilaciones de depuración). ¿Cómo modifico las banderas del enlazador? add_definitions() no funciona porque solo modifica los indicadores del compilador. Y sí, lo he envuelto en if (MSVC).

¿Cómo modifico las banderas del enlazador?


Para agregar indicadores de vinculador - las siguientes 4 variables CMake:

CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS CMAKE_STATIC_LINKER_FLAGS

se puede manipular fácilmente para diferentes configuraciones (depuración, lanzamiento ...) con la macro ucm de ucm

Los indicadores de vinculador también se pueden administrar por objetivo, utilizando target_link_libraries y pasando indicadores con un frente a ellos (pero no con un -l ) que se trataría como una biblioteca de enlaces y no como un indicador de enlaces.


Puede agregar indicadores de vinculador para un objetivo específico utilizando la propiedad LINK_FLAGS :

set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}")

(tenga en cuenta que agregué un espacio antes de la bandera ya que estoy usando APPEND_STRING )


Puede modificar los indicadores del vinculador en MSC utilizando el comentario #pragma (vinculador, ...)

Sin embargo, si desea hacerlo en el proceso de construcción con cmake, aquí están los nombres que necesita saber:

  • CMAKE_EXE_LINKER_FLAGS
  • CMAKE_SHARED_LINKER_FLAGS
  • CMAKE_MODULE_LINKER_FLAGS

(Gracias a Cmake.org ).