CMake、静态库和链接时优化

3
我正在尝试使用 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
文件包含以下命令:
/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文档指出:"-fwhole-program ... 这个选项不应与-flto一起使用。" - m.s.
另一部分说:“如果程序不需要导出任何符号,则可以组合使用-flto和-fwhole-program,以允许过程间优化器使用更激进的假设,这可能会带来改进的优化机会。”静态库需要导出任何符号吗?对于可能愚蠢的问题,我很抱歉。 - graywolf
我无法帮助您进行库优化部分的工作,但是如果您只想更改ar命令行,请参见[CMAKE_CXX_ARCHIVE_CREATE](https://github.com/Kitware/CMake/blob/master/Modules/CMakeCXXInformation.cmake#L268)。因此,在您的`project()`命令之前或者更好地在GNU的工具链文件中,可以添加`set(CMAKE_CXX_ARCHIVE_APPEND"<CMAKE_AR> cq -flto -fwhole-program <TARGET><LINK_FLAGS> <OBJECTS>")`。有关详细信息,请参见[这里](https://dev59.com/zV0a5IYBdhLWcg3wS2-8)。 - Florian
我的CMakeLists是针对src子文件夹的,project()在根CMakeLists中定义。非常感谢您的建议,您能将其发布为答案吗?我下班回家后会尝试并接受它是否有效。还要感谢您提到了toolchain file,我会进一步阅读这个主题。 - graywolf
1个回答

4

-flto 不是 ar 的有效选项。您应该使用这些标志来设置 CMAKE_EXE_LINKER_FLAGS


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接