使用C++ stdlib系统调用无法运行make

Ham*_*amy 4 c++ makefile std

我在C++中有以下代码

  if (should_run_make) {
    std::string make = "make -C ";
    make.append(outdir);
    std::cout << "Make cmd is " << make << std::endl;
    system(make.c_str());
  }
Run Code Online (Sandbox Code Playgroud)

这报告如下:

make cmd是make -C/home/hamiltont/temp/make:输入目录 /home/hamiltont/temp' make: *** No targets. Stop. make: Leaving directory/ home/hamiltont/temp'

但是,手动操作可以通过多种方式正常工作,例如

[hamiltont@4 generator]$ make -C /home/hamiltont/temp/
make: Entering directory `/home/hamiltont/temp'
g++ -O3 -I/usr/include/openmpi-x86_64 -L/usr/local/lib -L/usr/lib64/openmpi/lib -lmpi -lmpi_cxx -lboost_serialization -lboost_mpi  stg_impl.cpp -o impl
make: Leaving directory `/home/hamiltont/temp'

[hamiltont@4 generator]$ cd /home/hamiltont/temp/
[hamiltont@4 temp]$ make
g++ -O3 -I/usr/include/openmpi-x86_64 -L/usr/local/lib -L/usr/lib64/openmpi/lib -lmpi -lmpi_cxx -lboost_serialization -lboost_mpi  stg_impl.cpp -o impl
Run Code Online (Sandbox Code Playgroud)

Die*_*Epp 6

您是否在C程序中生成makefile?这是我能想象的唯一原因会导致特定的错误信息.

make: *** No targets. Stop. 

重现错误

这是我如何生成该消息:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *fp = fopen("Makefile", "w");
    fputs("all:\n\techo Done.\n", fp);
    system("make");
    fclose(fp);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

可以预见,这会打印出来:

make: *** No targets.  Stop.

我可以预见,因为它Makefile会是空的!这是因为IO被缓冲了......

固定版本

所以,我在调用之前关闭文件system(),这会刷新缓冲区(fflush()也会这样做):

#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *fp = fopen("Makefile", "w");
    fputs("all:\n\techo Done.\n", fp);
    fclose(fp);
    system("make");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

echo Done.
Done.

为了清楚起见,我使用了C的IO功能,但同样的规则适用于<iostream>.

  • @Hamy:作为另一个选项,如果用大括号`{...}`包围代码并使流成为块范围变量,你仍然可以使用析构函数来关闭文件. (3认同)