Подтвердить что ты не робот

Включение флагов компоновщика с CMake

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

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

4b9b3361

Ответ 1

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

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

  • CMAKE_EXE_LINKER_FLAGS
  • CMAKE_SHARED_LINKER_FLAGS
  • CMAKE_MODULE_LINKER_FLAGS

(Благодаря Cmake.org).

Ответ 3

Использование библиотеки "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)

Ответ 4

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

CMAKE_EXE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS

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

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