【问题标题】:In Cmake pass flto=jobserver to gcc在 Cmake 中将 flto=jobserver 传递给 gcc
【发布时间】:2017-05-09 00:26:13
【问题描述】:

我正在使用 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.cppb.cpp 是任何合理的cpp(其中一个具有main)

使用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?

【问题讨论】:

  • 可以选择像ninja build system 这样的替代方案吗?这确实加快了my project builds 的速度,CMake 的好处是您可以轻松切换到生成另一个构建环境(试一试)。
  • @Florian,我会调查一下,但最好制定解决方案
  • 你用的是什么版本的cmake?您的最低版本 2.8 已经过时了。

标签: c++ makefile build cmake g++


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        • 2014-10-21
        • 2020-10-11
        • 1970-01-01
        • 1970-01-01
        • 2012-07-29
        相关资源
        最近更新 更多