CMake、静态库和链路时间优化

CMake、静态库和链路时间优化,cmake,g++,lto,Cmake,G++,Lto,我正在尝试使用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

我正在尝试使用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程序
应该在第一行
libmylib.a
之前。但我不知道如何强迫CMake把它放在那里

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


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

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

:“-fwhole program…此选项不应与-flto组合使用。”另一部分说“如果程序不需要导出任何符号,可以将-flto和-fwhole程序结合起来,以允许程序间优化器使用更积极的假设,从而改善优化机会。“。静态库是否需要导出任何符号?抱歉,可能是个愚蠢的问题,我无法帮助您完成库优化部分,但是如果您只是想更改
ar
命令行,请参阅。因此,您可以在
project()
命令之前添加
set(CMAKE\u CXX\u ARCHIVE\u APPEND“cq-flto-fwhole program”)
,或者在GNU的工具链文件中添加-code>(
CMAKE\u编译器在
project()
之前无效)。有关详细信息,请参见。my CmakeList用于src子文件夹,
project()
在根CmakeList中定义。。非常感谢你的建议,你能把它作为一个答案吗?我会在下班回家后尝试,如果工作的话,我会接受它。感谢您提到
工具链文件
,我们将阅读更多关于该主题的内容