Включение флагов компоновщика с CMake
При создании VS2010 целей с помощью CMake, я бы хотел, чтобы флаг /LTCG включался (только для release + release, если это возможно, но, если это возможно, но это нормально, если он включен для отладочных построений). Как изменить флаги компоновщика? add_definitions()
не работает, поскольку это только изменяет флаги компилятора. И да, я завернул его в (MSVC).
Как изменить флаги компоновщика?
Ответы
Ответ 1
Вы можете изменить флаги компоновщика в MSC, используя комментарий #pragma (компоновщик,...)
Однако, если вы хотите сделать это в процессе сборки с помощью cmake, вот имена, которые вам нужно знать:
-
CMAKE_EXE_LINKER_FLAGS
-
CMAKE_SHARED_LINKER_FLAGS
-
CMAKE_MODULE_LINKER_FLAGS
(Благодаря Cmake.org).
Ответ 2
и STATIC_LIBRARY_FLAGS
http://www.cmake.org/cmake/help/v2.8.8/cmake.html#prop_tgt:STATIC_LIBRARY_FLAGS
для статических библиотек
Ответ 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
- это будет рассматриваться как библиотека ссылок, а не флаг ссылки).