在Cmake中,将flto=jobserver传递给gcc

In Cmake pass flto=jobserver to gcc

本文关键字:jobserver gcc flto Cmake      更新时间:2023-10-16

我正在使用flto构建应用程序,我想在制作中使用的所有内核上并行化它,例如,如果我使用make -j4运行它,然后在4个内核上运行它

例:

cmake_minimum_required(VERSION 2.8)
project(a)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto=jobserver")
add_executable(a a.cpp b.cpp)

其中a.cppb.cpp是任何合理的CPP(其中一个具有主要)

make -j2一起跑步让我:

-- Configuring done
-- Generating done
-- Build files have been written to: ...
[ 33%] Building CXX object CMakeFiles/a.dir/b.cpp.o
[ 66%] Building CXX object CMakeFiles/a.dir/a.cpp.o
[100%] Linking CXX executable a
make[3]: warning: jobserver unavailable: using -j1.  Add '+' to parent make rule.
[100%] Built target a

因此,仅使用一个内核。是否可以在此处将有关作业服务器的信息传递给 gcc?

不幸的是,解决此问题的唯一方法似乎是修改cmake生成的生成文件。您必须将+前缀添加到表单的所有食谱行中

$(CMAKE_COMMAND) -E cmake_link_script path/to/link.txt ...

其中文件path/to/link.txt中的链接器命令包含-flto=jobserver选项。

作为一种解决方法,您可以尝试强制 LTO 作业计数:

set(CMAKE_CXX_COMPILE_OPTIONS_IPO ${CMAKE_CXX_COMPILE_OPTIONS_IPO} -flto=8)

请评论此错误以提高其优先级:https://gitlab.kitware.com/cmake/cmake/-/issues/17781 同时,您必须使用固定的 -flto=x