我正在尝试使用 CMake 和 g++ 创建使用链接时优化的静态库。
我遇到了以下错误:
据我从运行
我的假设正确吗?我应该如何解决这个问题?
补充说明:我完全是 LTO 的新手,如果它不适用于静态库,请告诉我。
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 的新手,如果它不适用于静态库,请告诉我。
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)。 - Florianproject()
在根CMakeLists中定义。非常感谢您的建议,您能将其发布为答案吗?我下班回家后会尝试并接受它是否有效。还要感谢您提到了toolchain file
,我会进一步阅读这个主题。 - graywolf