无论使用哪种构建工具,是否都有可能进行并行构建?
在Unix下,我们可以添加make -jN
,其中N是线程数,在Windows下,我添加了CXX_FLAG "/MP"
,然后在Visual Studio中使用它来并行构建...(?)我如何才能使我的版本在运行CMake时不总是扩展CMAKE_MAKE_PROGRAM
?
什么是一般解决方案?
我想到了这个:
# 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()
6条答案
按热度按时间hjqgdpho1#
在CMake 3.12中,这是可能的。
cmake(1)
Build a Project(cmake --build
)获得了--parallel [<jobs>]
和-j [<jobs>]
选项,用于指定并行生成级别。它们Map到本机生成工具的相应选项。正如dkg所提到的,您还可以设置环境变量
CMAKE_BUILD_PARALLEL_LEVEL
。CMake文档的链接:
fbcarpbf2#
如果您有CMake v2.8.8或更高版本,则可以使用Ninja作为GNU**
make
**的替代:或
如您所见,无需使用
CMAKE_MAKE_PROGRAM
,构建默认情况下并行运行,根据可用的CPU内核优化作业数量。Ninja基于一个低级的JSON配置来加速启动阶段。因此,它的JSON配置不容易手工编写,我总是使用高级工具/IDE来生成它:
由于C++构建通常需要大量内存,因此您的计算机必须提供与CPU内核数量一样多的内存。
正如Ruslan所指出的,CMake 3.12(2018)有一个新的选项
cmake --build -j <N>
,以限制构建到<N>
内核(作业)从而限制内存消耗如果您使用的是旧版本的CMake,您仍然可以使用cmake --build -- -j <N>
。选项--
告诉CMake将剩余的代码直接传递给底层的构建器工具,这是忍者。qfe3c7zg3#
现在用cmake进行并行构建非常简单,可以在使用“cmake --build”的时候加上“-j jobs_number”,例如:
更多详细信息可在CMAKE手册中找到:https://cmake.org/cmake/help/latest/manual/cmake.1.html#build-tool-mode
--parallel [],-j []生成时要使用的最大并发进程数。如果省略,则使用本机生成工具的默认数。
如果设置了CMAKE_BUILD_PARALLEL_LEVEL环境变量,则在未给定此选项时指定默认并行级别。
某些原生建置工具总是以平行方式建置。使用值1可用来限制为单一工作。
xa9qqrwz4#
如上所述,可以使用CMake
--parallel [<jobs>]
(或-j [<jobs>]
)选项来并行地构建解决方案。但我想指出的是,在Windows中,
会使用下列参数启动根MSBuild行程序:
这表示根MSBuild行程序会因为
/m:<jobs>
(或/maxcpucount:<jobs>
)而启动多个子MSBuild行程序。但是,因为/p:CL_MPCount=1
参数(如需详细信息,请参阅this link),每个子MSBuild最多只能执行一个编译器行程序。换句话说,每个MSBuild最多只能同时编译一个原始程式档。要克服此限制,可以按以下方式调用CMake:
此方法设置
/MP
option,从而允许在每个MSBuild示例下执行多个编译器进程。为了记录在案,要配置从Visual Studio GUI运行的构建,需要转到 * 设置 *:
maxcpucount
有影响。/MP
。nxagd54h5#
您不能跨平台执行此操作。-jN选项是make的一个参数,而不是生成的Makefile的一部分。但是,您可以让CMake生成一个Bash脚本,该脚本使用-jN为您的项目运行make(其中脚本查找您拥有的内核数量)。
8ehkhllq6#
我已经开始为基于
Unix Makefiles
的生成器编写一个parallelmake.sh
脚本。https://github.com/gabyx/ApproxMVBB和CMake文件中的相关部分:
https://github.com/gabyx/ApproxMVBB/blob/master/CMakeLists.txt#L89