当使用CMake生成VS2010目标时,我希望打开/LTCG标志(如果可能的话,仅适用于发布和发布与调试信息,但是对于调试构建打开也可以)。如何修改链接器标志?
如何修改链接器标志?
add_definitions()
不起作用,因为它只能修改编译器标志。是的,我已经将其包装在 if(MSVC) 中。如何修改链接器标志?
add_definitions()
不起作用,因为它只能修改编译器标志。是的,我已经将其包装在 if(MSVC) 中。使用#pragma comment(linker, ...)在MSC中可以修改链接器标志。
但是,如果您想在构建过程中使用cmake进行修改,以下是您需要知道的名称:
CMAKE_EXE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS
(感谢Cmake.org)。
对于静态库,使用STATIC_LIBRARY_FLAGS属性
详见http://www.cmake.org/cmake/help/v2.8.8/cmake.html#prop_tgt:STATIC_LIBRARY_FLAGS
如果要添加链接器标志,需要以下4个CMake变量:
CMAKE_EXE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS
-
(但不要加上-l
,否则会被视为链接库而不是链接标志)。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)
LINK_FLAGS
属性为特定目标添加链接器标志:set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}")
APPEND_STRING
,所以在标志之前添加了一个空格)