【问题标题】:CMake, static library and link time optimizationCMake、静态库和链接时间优化
【发布时间】:2015-07-24 22:17:03
【问题描述】:

我正在尝试使用 cmake 和 g++ 创建具有链接时间优化的静态库。

set(
    CMAKE_CXX_FLAGS
        "${CMAKE_CXX_FLAGS} -Wall -Werror -Wextra -pedantic -std=c++11"
)

if (CMAKE_COMPILER_IS_GNUCXX)
    set(
        CMAKE_STATIC_LINKER_FLAGS_RELEASE
            "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} -flto -fwhole-program"
    )
endif()

add_library(
    mylib STATIC
        mylib.cpp
)

但是在典型运行时

cmake -DCMAKE_BUILD_TYPE=Release ..
make

我收到以下错误:

/usr/bin/ar: two different operation options specified

link.txt 文件包含以下命令:

/usr/bin/ar cq libmylib.a  -flto -fwhole-program CMakeFiles/mylib.cpp.o
/usr/bin/ranlib libmylib.a

根据我对运行ar --help 的理解,-flto -fwhole-program 应该在第一行的libmylib.a 之前。但我不知道如何强制 CMake 把它放在那里。

我的假设正确吗?我该如何解决这个问题?

编辑:我想补充一点,我对使用 LTO 完全陌生,所以如果将它用于静态库没有意义,请告诉我。

【问题讨论】:

  • GCC documentation states: "-fwhole-program ... 此选项不应与 -flto 结合使用。"
  • 另一部分说“如果程序不需要导出任何符号,则可以结合 -flto 和 -fwhole-program 以允许过程间优化器使用更激进的假设,这可能会导致改善优化机会。”。静态库是否需要导出任何符号?抱歉可能是愚蠢的问题
  • 库优化部分我无能为力,但如果您只想更改ar 命令行,请参阅CMAKE_CXX_ARCHIVE_CREATE。因此,您可以在您的 project() 命令之前添加 set(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> cq -flto -fwhole-program <TARGET> <LINK_FLAGS> <OBJECTS>"),或者 - 更好 - 在 GNU 的工具链文件中添加(CMAKE_COMPILER_IS_GNUCXXproject() 之前无效)。详情请见here
  • 我的 CMakeLists 用于 src 子文件夹,project() 在根 CMakeLists 中定义。非常感谢您的建议,您可以将其发布为答案吗?下班回家我会试试,如果工作就接受。感谢您提及toolchain file,将阅读有关该主题的更多信息

标签: cmake g++ lto


【解决方案1】:

-flto 不是ar 的有效选项。您应该将这些标志用于CMAKE_EXE_LINKER_FLAGS

【讨论】:

    猜你喜欢
    • 2013-06-04
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2020-12-17
    • 2017-03-14
    相关资源
    最近更新 更多