好消息!CMake v3.9终于支持 LTO了。
例子
这是一个示例代码来展示它是如何工作的:
cmake_minimum_required(VERSION 3.9.4)
include(CheckIPOSupported)
check_ipo_supported(RESULT supported OUTPUT error)
add_executable(example Example.cpp)
if( supported )
message(STATUS "IPO / LTO enabled")
set_property(TARGET example PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
else()
message(STATUS "IPO / LTO not supported: <${error}>")
endif()
对于 GCC,这将添加-flto -fno-fat-lto-objects
到目标编译命令。
检查编译器支持
模块CheckIPOSupported提供检查编译器是否支持过程间优化(IPO/ LTO) :
check_ipo_supported([RESULT <result>] [OUTPUT <output>]
[LANGUAGES <lang>...])
如果没有传递参数 (= check_ipo_supported()
),则会引发错误以指示它不受支持,否则result
变量设置为YES
or 或NO
。更多细节在模块的文档中描述。
启用 LTO
LTO 可以为单个目标启用,也可以默认为所有目标启用。
单个目标的 LTO
INTERPROCEDURAL_OPTIMIZATION
为设置为的目标启用 LTO TRUE
。这是通过以下set_property()
命令完成的:
set_property(TARGET name-target-here
PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
默认为 LTO
CMAKE_INTERPROCEDURAL_OPTIMIZATION
可以通过设置为默认启用 LTO TRUE
:
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
这将为在此行之后INTERPROCEDURAL_OPTIMIZATION
创建的所有目标启用。之前创建的不受影响。
也可以看看