首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用CMake启用链接时间优化(LTO)?

如何使用CMake启用链接时间优化(LTO)?
EN

Stack Overflow用户
提问于 2015-07-11 09:37:12
回答 4查看 32.4K关注 0票数 48

我有最新的cmake,并尝试了所有构建配置(调试、MinSizeRel、RelWithDebugInfo、Release、General) --在生成的makefile字符串-lto中没有看到(文本搜索),所以或者该功能仍然不存在,或者它需要手动交互(在这种情况下,文档中对LTO或链接时间优化的文本搜索)没有结果,所以我在正式文档中看不到启用LTO的方法。

有没有任何方法可以使LTO“全局”(对于所有编译器),而不指定可能在最坏的情况下只有GCC支持的手动标志?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-20 17:23:15

编辑:截至2015年10月28日,在CMake IRC上

代码语言:javascript
运行
复制
jcelerier | I have a question about INTERPROCEDURAL_OPTIMIZATION
jcelerier | it sounds like it should enable -flto on gcc
+ngladitz | jcelerier: its only implemented for the intel compiler
jcelerier | ngladitz: ah, okay
jcelerier | are there other switches for pgo / lto ?
jcelerier | or must it be done by hand ?
+ngladitz | there currently is no first class support otherwise     

相关CMake问题:https://gitlab.kitware.com/cmake/cmake/issues/15245

CMake在目标上具有INTERPROCEDURAL_OPTIMIZATION属性,听起来它可能在某些平台上启用LTO。

链接:OPTIMIZATION.html

若要在目标MyLib上启用它,请执行以下操作:

代码语言:javascript
运行
复制
add_library(MyLib ...)
...
set_property(TARGET MyLib PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
票数 15
EN

Stack Overflow用户

发布于 2017-11-18 20:30:58

好消息!CMake v3.9最终支持LTO

示例

下面是演示它如何工作的示例代码:

代码语言:javascript
运行
复制
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添加到目标编译命令中。

检查编译器支持

模块https://cmake.org/cmake/help/latest/module/CheckIPOSupported.html#module:CheckIPOSupported提供检查编译器是否支持过程间优化(IPO/LTO)

代码语言:javascript
运行
复制
check_ipo_supported([RESULT <result>] [OUTPUT <output>]
                    [LANGUAGES <lang>...])

如果没有传递任何参数(= check_ipo_supported()),则会引发错误以指示不支持该参数,否则result变量将被设置为YESNO。更多细节将在该模块的文档中描述。

使能LTO

LTO可用于单个目标,也可作为所有目标的默认启用。

用于单个目标的LTO

若要为目标集INTERPROCEDURAL_OPTIMIZATION启用LTO,请将其设置为TRUE。这是由set_property()命令完成的:

代码语言:javascript
运行
复制
set_property(TARGET name-target-here
             PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)

LTO作为默认

通过将CMAKE_INTERPROCEDURAL_OPTIMIZATION设置为TRUE,可以对每个缺省值启用LTO

代码语言:javascript
运行
复制
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)

这将为该行之后创建的所有目标启用INTERPROCEDURAL_OPTIMIZATION。以前创建的不受影响。

另请参阅

票数 99
EN

Stack Overflow用户

发布于 2016-01-28 12:42:23

是的,根据源代码,对gcc/clang编译器不支持LTO。他们只对Intel编译器有一些支持。

我有一些cmake 3.4.3的grep输出:

代码语言:javascript
运行
复制
grep -HiR 'INTERPROCEDURAL_OPTIMIZATION' *
Help/manual/cmake-properties.7.rst:  
/prop_dir/INTERPROCEDURAL_OPTIMIZATION_CONFIG
Help/manual/cmake-properties.7.rst:  
/prop_dir/INTERPROCEDURAL_OPTIMIZATION
Help/manual/cmake-properties.7.rst:  
/prop_tgt/INTERPROCEDURAL_OPTIMIZATION_CONFIG
Help/manual/cmake-properties.7.rst:  
/prop_tgt/INTERPROCEDURAL_OPTIMIZATION
Help/prop_dir/INTERPROCEDURAL_OPTIMIZATION.rst:INTERPROCEDURAL_OPTIMIZATION
Help/prop_dir/INTERPROCEDURAL_OPTIMIZATION_CONFIG.rst:INTERPROCEDURAL_OPTIMIZATION_<CONFIG    
Help/prop_dir/INTERPROCEDURAL_OPTIMIZATION_CONFIG.rst:This is a
per-configuration version of INTERPROCEDURAL_OPTIMIZATION.
Help/prop_tgt/INTERPROCEDURAL_OPTIMIZATION.rst:INTERPROCEDURAL_OPTIMIZATION
Help/prop_tgt/INTERPROCEDURAL_OPTIMIZATION_CONFIG.rst:INTERPROCEDURAL_OPTIMIZATION_<CONFIG    
Help/prop_tgt/INTERPROCEDURAL_OPTIMIZATION_CONFIG.rst:This is a
per-configuration version of INTERPROCEDURAL_OPTIMIZATION.
Modules/Platform/Linux-Intel.cmake:    # INTERPROCEDURAL_OPTIMIZATION
Source/cmCommonTargetGenerator.cxx: 
if(this->GetFeatureAsBool("INTERPROCEDURAL_OPTIMIZATION"))
Source/cmGeneratorTarget.cxx:          
"INTERPROCEDURAL_OPTIMIZATION", config))
Source/cmMakefileLibraryTargetGenerator.cxx: 
if(this->GetFeatureAsBool("INTERPROCEDURAL_OPTIMIZATION") &&
Tests/IPO/CMakeLists.txt:set_property(DIRECTORY PROPERTY
INTERPROCEDURAL_OPTIMIZATION 1)

如您所见,我们只有Intel平台模块。

因此,我为这个非常有用的特性创建了特性请求:https://cmake.org/Bug/view.php?id=15939

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31355692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档