我正在使用flto构建应用程序,我想在make中使用的所有核心上并行化,例如,如果我使用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.cpp
和b.cpp
是任何合理的cpps(其中一个是主要的)
使用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
因此,只使用一个核心。是否可以将有关jobserver的信息传递给gcc?
答案 0 :(得分:0)
不幸的是,解决此问题的唯一方法似乎是修改cmake
生成的makefile。您必须将+
前缀添加到表单的所有配方行
$(CMAKE_COMMAND) -E cmake_link_script path/to/link.txt ...
文件path/to/link.txt
中的链接器命令包含-flto=jobserver
选项。
答案 1 :(得分:0)
作为一种解决方法,您可以尝试强制执行LTO作业:
set(CMAKE_CXX_COMPILE_OPTIONS_IPO ${CMAKE_CXX_COMPILE_OPTIONS_IPO} -flto=8)
答案 2 :(得分:0)
请对此错误进行评论,以提高其优先级:https://gitlab.kitware.com/cmake/cmake/-/issues/17781 同时,您必须使用固定的-flto = x