4

我在 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());
  }

这会报告以下内容:

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
4

1 回答 1

6

您是从 C 程序中生成 makefile 吗?这是我可以想象会导致该特定错误消息的唯一原因。

make: *** 没有目标。停止。 

重现错误

以下是我如何生成该消息:

#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;
}

可以预见的是,这会打印:

make: *** 没有目标。停止。

我说可以预见,因为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;
}

输出:

回声完成。
完毕。

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

于 2013-03-05T01:58:02.970 回答