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

これにより、次のことが報告されます。

Makecmdは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 に答える