如何在CMake中配置可移植并行版本?

Gab*_*iel 43 cmake parallel-builds

无论使用哪种构建工具,都能以某种方式实现并行构建吗?

在Unix下我们可以添加make -jN N是线程数,在Windows下我添加到CXX_FLAG "/MP" 哪个然后在Visual Studio中用于并行构建......?CMAKE_MAKE_PROGRAM当我运行CMake时,如何使我的版本不会总是扩展?

什么是一般解决方案?

我想出了这个:

# Add some multithreaded build support
MARK_AS_ADVANCED(MULTITHREADED_BUILD)
set(MULTITHREADED_BUILD 12 CACHE STRING "How many threads are used to build the project")
if(MULTITHREADED_BUILD)
    if(${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
            message(STATUS ${CMAKE_BUILD_TOOL})
            set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} -j${MULTITHREADED_BUILD}")
            message(STATUS "Added arguments to CMAKE_BUILD_TOOL: ${CMAKE_MAKE_PROGRAM}")
    elseif(MSVC)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
      message(STATUS "Added parallel build arguments to CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
    endif()
endif()
Run Code Online (Sandbox Code Playgroud)

usr*_*567 28

使用CMake 3.12,这是可能的.从发行说明:

"cmake(1)"构建工具模式("cmake -build")获得了" - parallel []"和"-j []"选项以指定并行构建级别.它们映射到本机构建工具的相应选项.

编辑:正如@dkg所提到的,您还可以设置环境变量CMAKE_BUILD_PARALLEL_LEVEL.

链接到CMake的文档:

  • “它们映射到本机构建工具的相应选项”到底是什么意思?例如,当使用 CMake 3.16.4 和 Ninja 1.10.0 时,它似乎不会自动为 MSVC 设置“/MP”标志。因此,对于真正/完全并行的构建来说,似乎仍然没有可用的跨平台解决方案。 (3认同)
  • 您还可以设置env var`CMAKE_BUILD_PARALLEL_LEVEL` (2认同)

Nik*_*ita 16

正如上面已经提到的,可以使用CMake 的--parallel [<jobs>](或-j [<jobs>]) 选项来并行构建解决方案。

\n

但我想指出的是,在 Windows 中,有一个命令

\n
cmake.exe --build --parallel <jobs>\n
Run Code Online (Sandbox Code Playgroud)\n

使用以下参数启动根 MSBuild 进程:

\n
msbuild.exe /m:<jobs> /p:CL_MPCount=1 <another-useful-arguments...>\n
Run Code Online (Sandbox Code Playgroud)\n

这意味着根 MSBuild 进程将由于/m:<jobs>(或/maxcpucount:<jobs>)启动多个子 MSBuild 进程。但由于参数的原因,每个子 MSBuild 最多运行一个编译器进程/p:CL_MPCount=1(有关更多详细信息,请参阅此链接)。也就是说每个MSBuild同时最多只能编译一个源文件。

\n

为了克服这一限制,可以通过以下方式调用 CMake:

\n
cmake.exe --build --parallel <n_msbuild> -- /p:CL_MPcount=<n_cl>\n
Run Code Online (Sandbox Code Playgroud)\n

此方法设置/MP选项,从而允许每个 MSBuild 实例下有多个编译器进程。

\n
\n

并记录在案。要配置从 Visual Studio GUI 运行的构建,需要转到“设置”

\n
    \n
  • 选项“项目和解决方案 \xe2\x86\x92 构建并运行 \xe2\x86\x92 并行项目构建的最大数量”影响maxcpucount.
  • \n
  • 选项“项目和解决方案 \xe2\x86\x92 VC++ 项目设置 \xe2\x86\x92 构建 \xe2\x86\x92 最大并发 C++ 编译”表示 的默认边界/MP
  • \n
\n


oli*_*bre 13

如果你有makev2.8.8或更高版本,你可以使用GNUCMAKE_MAKE_PROGRAM作为替代cmake --build -j <N>

mkdir build
cd    build
cmake -G Ninja ..
ninja              # Parallel build (no need -j12)
Run Code Online (Sandbox Code Playgroud)

要么

mkdir build
cd    build
cmake -G Ninja ..
cmake --build .    # Parallel build using Ninja
Run Code Online (Sandbox Code Playgroud)

如您所见,不需要使用<N>,默认情况下,构建是并行运行的,根据可用的CPU内核优化作业数.

cmake --build -- -j <N>基于低级JSON配置来加速启动阶段.因此,它的JSON配置不容易手工编写,我总是使用高级工具/ IDE生成它:

由于C++构建通常需要大量内存,因此您的计算机必须提供与CPU内核数量相同的内存.

  • 关于最后一句:您可以使用“-j N”选项限制使用的核心数量,从而限制使用的内存量。 (2认同)

cun*_*ang 10

现在使用 cmake 并行构建非常简单。使用“cmake --build”时可以添加“-j jobs_number”。例如:

\n
cmake --build . -j 24\n
Run Code Online (Sandbox Code Playgroud)\n

更多详细信息可以在 CMAKE 手册中找到:https://cmake.org/cmake/help/latest/manual/cmake.1.html#build-tool-mode

\n
\n

--parallel[], -j[] 构建时使用的最大并发进程数。如果省略,则使用本机 build\ntool\xe2\x80\x99s 默认编号。

\n

如果设置了 CMAKE_BUILD_PARALLEL_LEVEL 环境变量,则在未给出此选项时指定默认并行级别。

\n

一些本机构建工具总是并行构建。使用\n值 1 可用于限制单个作业。

\n
\n

  • @pellucidcoder,原因可能是你至少需要 CMake 3.12 (3认同)