当我启用LTO/IPO时,为什么CMake设置-no-fat-lto-objects?

yizd12fk  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(149)

我使用CMake为我的C编译启用IPO(过程间优化):

set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)

正如预期的那样,这将导致添加-flto编译器标志。但是,它还添加了-fno-fat-lto-objects:这意味着生成的目标文件将 * 只有 * 中间代码,而不是正确编译的中间代码;这意味着链接器必须支持我的系统编译器的中间表示,并且能够识别IPO/LTO。
我没有要求-fno-fat-lto-objects,也不想要它。我可以让CMake * 不 * 添加此选项吗?

7xzttuei

7xzttuei1#

我相信这是一个CMake bug...我有now filed
开发人员只是做出了错误的假设,认为这是人们想要的。

t3psigkw

t3psigkw2#

if(CMAKE_C_COMPILER MATCHES "GNU")
   set(CMAKE_C_COMPILE_OPTIONS_IPO "-flto")
endif()

如何找到它:

  • 导航到您的CMake安装目录和Modules,大部分内容都在那里。
  • 在我的Linux系统上是/usr/share/cmake/Modules
  • 查找您感兴趣的字符串或类似字符串
  • 在我的系统上,我做到了:
$ grep fno-fat-lto-objects -r .
./Compiler/GNU.cmake:      list(APPEND __lto_flags -fno-fat-lto-objects)
  • 导航并检查结果文件,即使用字符串的上下文:
# '-flto' introduced since GCC 4.5:
   # * https://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Option-Summary.html (no)
   # * https://gcc.gnu.org/onlinedocs/gcc-4.5.4/gcc/Option-Summary.html (yes)
   if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.5)
     set(_CMAKE_${lang}_IPO_MAY_BE_SUPPORTED_BY_COMPILER YES)
     set(__lto_flags -flto)

     if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.7)
       # '-ffat-lto-objects' introduced since GCC 4.7:
       # * https://gcc.gnu.org/onlinedocs/gcc-4.6.4/gcc/Option-Summary.html (no)
       # * https://gcc.gnu.org/onlinedocs/gcc-4.7.4/gcc/Option-Summary.html (yes)
       list(APPEND __lto_flags -fno-fat-lto-objects)
     endif()

     set(CMAKE_${lang}_COMPILE_OPTIONS_IPO ${__lto_flags})
  • 提出一个解决方案来实现此类coe的自定义行为。

相关问题