Включение флагов компоновщика с помощью CMake - PullRequest
20 голосов
/ 23 августа 2010

При создании целей VS2010 с помощью CMake мне бы хотелось, чтобы флаг / LTCG был включен (только для release + releasewithdebinfo, если это возможно, но хорошо, если он включен для отладочных сборок).Как изменить флаги компоновщика?add_definitions() не работает, потому что это только изменяет флаги компилятора.И да, я завернул его, если (MSVC).

Как изменить флаги компоновщика?

Ответы [ 5 ]

28 голосов
/ 23 августа 2010

Вы можете изменить флаги компоновщика в MSC, используя #pragma comment (linker, ...)

Однако, если вы хотите сделать это в процессе сборки с помощью cmake, вот имена, которые вынужно знать:

  • CMAKE_EXE_LINKER_FLAGS
  • CMAKE_SHARED_LINKER_FLAGS
  • CMAKE_MODULE_LINKER_FLAGS

(Спасибо Cmake.org ).

4 голосов
/ 28 ноября 2012

и STATIC_LIBRARY_FLAGS http://www.cmake.org/cmake/help/v2.8.8/cmake.html#prop_tgt:STATIC_LIBRARY_FLAGS

для статических библиотек

2 голосов
/ 28 февраля 2017

Использование библиотеки "ucm" кажется хорошим подходом. Я бросил простой макрос, который помогает мне единообразно управлять флагами компоновщика в CMake для всех конфигураций, а также позволяет использовать его для конкретного компилятора. (Простая установка переменной может привести к тому, что флаги будут складываться, когда CMake настроен несколько раз.)

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()

Затем поддерживаются другие компиляторы путем создания макроса для конкретного компилятора, который проверяет, используется ли компилятор. Это затрудняет установку правильного флага на неправильный компилятор.

if(CMAKE_COMPILER_IS_GNUCXX)

и

if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
1 голос
/ 11 апреля 2018

Вы можете добавить флаги компоновщика для конкретной цели, используя свойство LINK_FLAGS:

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

(обратите внимание, что я добавил пробел перед флагом, поскольку я использую APPEND_STRING)

0 голосов
/ 07 октября 2016

Для добавления флагов компоновщика - следующие 4 переменные CMake:

CMAKE_EXE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS

можно легко манипулировать для различных конфигураций (отладка, выпуск ...) с помощью макроса ucm_add_linker_flags ucm

флагами компоновщика также можно управлять для каждой цели - используя target_link_libraries и передавая флаги с - перед ними (но не с -l), которые будут обрабатываться как библиотека ссылок, а не флаг ссылки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...