私のMakefileは空ですが、makeはいくつかの古いコマンドを実行しています。

私のMakefileは空ですが、makeはいくつかの古いコマンドを実行しています。

奇妙なエラーが発生し、次のように減少しました。 Makefileとcppファイルという2つの空のファイルしかないフォルダがあります。

$ ls -la
total 8
drwxrwxr-x  2 erelsgl erelsgl 4096 Mar  3 20:12 .
drwxrwxr-x 13 erelsgl erelsgl 4096 Mar  3 20:10 ..
-rw-rw-r--  1 erelsgl erelsgl    0 Mar  3 20:12 Demo.cpp
-rw-rw-r--  1 erelsgl erelsgl    0 Mar  3 20:09 Makefile
$ cat Makefile 
$ cat Demo.cpp 

これを実行すると、make期待される結果が得られます。

$ make
make: *** No targets.  Stop.

しかし、実行するとmake Demo.o非常に奇妙な結果が表示されます。

$ make Demo.o
clang++-5.0 -std=c++17   -c -o Demo.o Demo.cpp
make: clang++-5.0: Command not found
<builtin>: recipe for target 'Demo.o' failed
make: *** [Demo.o] Error 127

"clang++-5.0 -std=c++17" コマンドは実際に数日前に Makefile にありましたが、ずっと前に clang++-9 に置き換えました。ご覧のとおり、Makefileは完全に空です。なぜmakeこれらの古いコマンドはまだ実行されていますか?

編集:次の2行を含むようにMakefileを変更しても同じことが起こります。

%.o: %.cpp xxx.h
    clang++-9 --compile $< -o $@

xxx.h ファイルが存在しない場合。これはとても混乱しています。実行してみるmake Demo.oとclang++-9ではなくclang++-5.0でビルドされました!

ベストアンサー1

バラよりこのMakefileはコンパイラを指定せずにどのようにCプログラムを生成しますか?背景。 Makeには、さまざまなファイルを構築する方法を教える組み込みルールがあります。この特別なケースでは、オブジェクトファイルを要求し、.cpp現在のディレクトリに一致するファイルがあるため、.cppオブジェクトファイルの構築方法を指定する規則を使用します。ファイルから。

GNU Makeでは、この規則の一部は、特にCXXC ++コンパイラの変数とCXXFLAGSC ++コードをコンパイルするときに使用されるフラグを使用します。環境にこれらの変数の値が含まれている場合、その値は組み込みのデフォルト値よりも優先されます。CXXそれでも設定されているので、Makeclang++-5.0はそれを使ってビルドを試みますDemo.o

2行のMakefileを使用すると、定義したレシピは使用されません。なぜなら、すべての前提条件が存在するわけではなく、すべて実現できないからです。。代わりに、通常のパターンルールを再利用しますが、まだにCXX設定してくださいclang++-5.0

-rこのオプションを使用して、組み込みルールを完全に無効にできますmake。したがって、補充することもできます。

Demo.o: Demo.cpp xxx.h

どのレシピも組み込みルールを使用しませんが、追加する必要がありますxxx.hDemo.cpp存在xxx.hせず、ビルドできないため正しく失敗します)。

おすすめ記事