Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 警告";“强行进入潜艇”;并行执行make_Parallel Processing_Cmake_Makefile - Fatal编程技术网

Parallel processing 警告";“强行进入潜艇”;并行执行make

Parallel processing 警告";“强行进入潜艇”;并行执行make,parallel-processing,cmake,makefile,Parallel Processing,Cmake,Makefile,当我运行make-j3并行构建时,我得到 warning: -jN forced in submake: disabling jobserver mode. 在中,我发现发出了警告 如果make在上检测到与并行处理相关的错误条件 子制造商可以通信的系统 这些错误情况是什么?我可以做些什么来修复它们或抑制错误消息 makefile是从CMake生成的,因此我无法(=我不想)编辑makefile。如果从makefile而不是通过变量$(make)调用make,通常会出现此消息 例如: 改变 foo

当我运行
make-j3
并行构建时,我得到

warning: -jN forced in submake: disabling jobserver mode.
在中,我发现发出了警告

如果make在上检测到与并行处理相关的错误条件 子制造商可以通信的系统

这些错误情况是什么?我可以做些什么来修复它们或抑制错误消息


makefile是从CMake生成的,因此我无法(=我不想)编辑makefile。

如果从makefile而不是通过变量$(make)调用make,通常会出现此消息

例如:

改变

foo: cd foo/ && make foo 傅: cd-foo/&制作foo 到

傅: cd foo&$(制作)foo
使用较新版本的GNU make(4.0)和CMake(2.8.6和3.3),我无法再重现警告。其中一个同时得到了修复。

这与多线程make功能有关。当已经是多线程的make进程中还有另一个多线程make时,就会发生这种情况。由于存在第二级多线程make,因此内部同步不可用

可以通过-j参数修复此问题

make -j 1
上面的代码将避免多线程,并将删除警告

同样,我们也可以在makefile中使用
-j
参数

target:
    $(MAKE) -j 1 -C ${SUBDIR} $@

上述规则不会为
submake
生成线程,它将避免警告。

您可以为顶级Makefile调用
make-j3
,这意味着最多可以同时构建3个目标(make使用3个线程来构建)。您的顶级Makefile(由CMake生成)运行另一个make(称为子make)。在这个调用中,使用了另一个
-jN
选项。因此,sub make没有为两个make使用公共jobserver,而是使用另外N个线程来构建其目标。因此,总共有多达
3+N
个线程用于构建。这就是这个警告的目的

要为父品牌和子品牌启用通用jobserver,有2个要求:

  • 显式
    -jN
    选项不得传递给子制造商。不带此参数调用sub make
  • 必须使用
    $(make)
    表达式调用子make(而不仅仅是普通的
    make
    )。或者,可以在
    make
    命令之前添加
    +
    前缀。有关详细信息,请参阅

如果这两个要求都得到满足,那么,当您为顶级Makefile运行
make-jN
时,父make和子make使用N个线程共同构建。

我没有自己编写Makefile,它是由CMake自动生成的。CMake通常会正确地执行此操作,也许您是从CmakeList.txwell调用make,就我而言,这正是我所说的潜艇。我有一个函数
sub\u make=$(make)-C$(TOPDIR)/subdir/$(1)$(2)
,然后我做了例如
$(调用subproject,all)
。所以,正如你所说,它是
$(MAKE)
。但我还是得到了警告。好吧。事实证明,由于某种原因,
$(MAKE)
调用在MAKE函数中调用时无法正常工作。在这种情况下,函数必须在等号后有
@+
符号。因此,在我前面的示例中,为了使其工作,我必须将其声明为
sub_make=@+$(make)-C$(TOPDIR)/subdir/$(1)$(2)
感谢分享这些见解。但是使用CMake生成makefile,我无法控制它们。由于它似乎在上游CMake和/或GNU make中得到了修复,我对这个主题很满意。如何在CMakeLists.txt中运行子Makefile?我认为只有CMake在调用make和submake。但在你提出问题后,我不再100%确定。
target:
    $(MAKE) -j 1 -C ${SUBDIR} $@