奇妙なエラーが発生し、次のように減少しました。 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では、この規則の一部は、特にCXX
C ++コンパイラの変数とCXXFLAGS
C ++コードをコンパイルするときに使用されるフラグを使用します。環境にこれらの変数の値が含まれている場合、その値は組み込みのデフォルト値よりも優先されます。CXX
それでも設定されているので、Makeclang++-5.0
はそれを使ってビルドを試みますDemo.o
。
2行のMakefileを使用すると、定義したレシピは使用されません。なぜなら、すべての前提条件が存在するわけではなく、すべて実現できないからです。。代わりに、通常のパターンルールを再利用しますが、まだにCXX
設定してくださいclang++-5.0
。
-r
このオプションを使用して、組み込みルールを完全に無効にできますmake
。したがって、補充することもできます。
Demo.o: Demo.cpp xxx.h
どのレシピも組み込みルールを使用しませんが、追加する必要がありますxxx.h
(Demo.cpp
存在xxx.h
せず、ビルドできないため正しく失敗します)。