gcc makefileエラー:「ターゲットを作成するルールがありません...」


356

プロジェクトをコンパイルするためにメイクファイルでGCC(linux)を使用しようとしています。

このコンテキストでは解読できないように見える次のエラーが表示されます。

"No rule to make target 'vertex.cpp', needed by 'vertex.o'.  Stop."

これはメイクファイルです:

a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

main.o: main.cpp main.h
    g++ -c main.cpp

vertex.o: vertex.cpp vertex.h
    g++ -c vertex.cpp

edge.o: edge.cpp edge.h
    g++ -c num.cpp

vlist.o: vlist.cpp vlist.h
    g++ -c vlist.cpp

elist.o: elist.cpp elist.h
    g++ -c elist.cpp

vnode.o: vnode.cpp vnode.h
    g++ -c vnode.cpp

enode.o: enode.cpp enode.h
    g++ -c node.cpp

2
ソースファイルを「存在しない」ようにする「典型的な」例は、VPATHまたはSRC変数を追加する必要があるときに誤ってリセットすることです。のVPATH=代わりに使用することを意味しVPATH+=ます。これにより、Makefileファイルは実際にファイルが存在するときにファイルを見ることができなくなります。
チャン・キム

回答:


425

これは通常、vertex.cpp利用可能と呼ばれるファイルを作成できないためです。それを確認します:

  • そのファイルは存在します。
  • あなたが作るとき、あなたは正しいディレクトリにいます。

それ以外は、他に提案することはあまりありません。おそらく、そのディレクトリのディレクトリリストを提供できます。


2
はい、一部のクラスには.cppファイルがないため、エラーが発生していませんでした。ありがとう。
メイア、

4
あなたは、いくつかのヘッダファイルが存在する場合にも、あなたが削除するようなエラーが出るが、あなたのMakefileに残っていることができます
ADY

@par、それは私にとって別の質問のように見えます。あなたがいる場合は、おそらくより多くの露出を得るでしょう尋ねる質問として、それを。
paxdiablo

また、Makefileを編集した後は必ず保存してください。すべての編集を行った後、CTRL + Sを押すのを忘れました
Tim

80

私の経験では、このエラーはスペルミスが原因で発生することがよくあります。

今日、このエラーが発生しました。

make [1]:***ターゲットをmaintenaceDialog.cpp', needed bymaintenaceDialog.o ' にするルールはありません。やめる。

私の場合、エラーは単なるスペルミスでした。MAINTENANCEという単語には3番目のNがありませんでした。

また、ファイル名のスペルを確認してください。


2
この場合のメタwhyは、オブジェクト/ソース/ヘッダーの関係を明示的にリストしているためです。SubConsCMakeなどの新しいツールを試さない場合gcc -MT 、gnu makeパターンでこれを解決できます。ご覧ください。
Nathan Kidd

あなたは私の日を救った!ありがとうございました!:)
Sunit Gautam

私の場合、パスは間違って../../src/file.cいましたが、実際にはそうでした../../src/folder/file.c
Rasmi Ranjan Nayak

31

このメッセージが表示されるより一般的な理由は、ソースファイルが存在するディレクトリを含めるのを忘れたためです。その結果、gccはこのファイルが存在しないと「考え」ます。

gccに-I引数を使用してディレクトリを追加できます。


14

私の場合、セパレーターとしてカンマ頭をカンマで使用していました。あなたの例を使用するために私はこれをしました:

a.out: vertex.o, edge.o, elist.o, main.o, vlist.o, enode.o, vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

同等のものに変更する

a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

修正しました。


11

それは正確ですか?Makefile構文は空白を認識し、アクションの下でコマンドをインデントするにはタブが必要であることを覚えておいてください。


7

私が見つけた問題は、他の人々が述べたものよりも愚かだった。

私たちのメイクファイルには、ビルドするもののリストが渡されます。TheOtherLibrary以下に示すように、誰かがリストの1つに追加しました。

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

彼らはこれを行うべきでした:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

彼らが2番目の方法でそれをしたなら、彼らはLibraryビルドを一掃しなかっただろう。プラスイン+=は非常に重要です。


6

私の場合、Makefileの複数行ルールエラーが原因でした。私は次のようなものを持っていました:

OBJS-$(CONFIG_OBJ1)            += file1.o file2.o \
                                  file3.o file4.o \
OBJS-$(CONFIG_OBJ2)            += file5.o 
OBJS-$(CONFIG_OBJ3)            += file6.o
...

CONFIG_OBJ1のルールのファイルリストの最後にあるバックスラッシュがこのエラーの原因でした。それは次のようになります:

OBJS-$(CONFIG_OBJ1)            += file1.o file2.o \
                                  file3.o file4.o
OBJS-$(CONFIG_OBJ2)            += file5.o
...

5

よくある間違いの1つは、別のファイル名のタイプミスかもしれません。

あなたの例は非常に簡単ですが、時々混乱するかもしれないのはmakeそれ自身のメッセージです。例を考えてみましょう。

私のフォルダの内容は:

$ ls -1
another_file
index.md
makefile

私のmakefileように見えるのに対して

all: index.html

%.html: %.md wrong_path_to_another_file
    @echo $@ $<

本来あるindex.mdべき場所はあるし、名前に間違いはないが、メッセージmake

make: *** No rule to make target `index.html', needed by `all'.  Stop.

正直なところ、メッセージは紛らわしいです。ただルールはないと言っているだけです。実際、それはルールが間違っていることを意味しますが、ワイルドカード(パターン)により、ルールは問題のmake正確な原因を特定できません。

makefile少し変更しましょう。つまり、パターンを明示的なルールに置き換えます。

index.html: index.md wrong_path_to_another_file

そして今私たちが得るメッセージは次のようになります:

make: *** No rule to make target `wrong_path_to_another_file', needed by `index.html'.  Stop.

奇跡!以下が結論付けられるかもしれません:

  • のメッセージはmakeルールに依存し、必ずしも問題の根本を指すとは限りません

  • makefileこのメッセージで指定されたものとは異なる他の問題がある可能性があります

これで、ルール内の他の依存関係チェックするというアイデアが思い付きました

all: index.html

%.html: %.md another_file
    @echo $@ $<

これだけで、望ましい結果が得られます。

$ make
index.html index.md

3

私の場合、エラーメッセージは古いファイル名を参照していましたが、名前が変更されたために存在しなくなりました。古い情報はMakefileからではなく、.depsディレクトリ内のファイルからのものであることがわかりました。

あるマシンから別のマシンにファイルをコピーした後、このエラーに遭遇しました。そのプロセスでは、タイムスタンプが一貫性のない状態になっており、複数のジョブを並行して実行しているときに "make"を混乱させたと思います(このバグレポートと同様)。

を使用したシーケンシャルビルドmake -j 1は影響を受けませんでしたが、エイリアス(make -j 8)を使用していたため、気付くまでに少し時間がかかりました。

状態をクリーンアップするために、すべての.depsファイルを削除してMakefileを再生成しました。これらは私が使用したコマンドです:

find | grep '.deps' | xargs rm
find | grep '.deps' | xargs rmdir
autoreconf --install # (optional, but my project is using autotools) 
./configure

その後、建物は再び機能しました。


2

John the Ripperを "bleeding-jumbo"でビルドしようとすると、 "make:*** No rule to make target 'linux-x86-64'"のようなエラーが発生します。代わりにこのコマンドを実行してみてください:./configure && make


0

私の場合、ソースファイルまたは古いオブジェクトファイル、あるいはその両方が、セミクラッシュしたIDEによって、または適切に機能しなくなったバックアップクラウドサービスからロック(読み取り専用)されていました。フォルダ構造に関連付けられていたすべてのプログラムとサービスを再起動すると、問題が解決しました。


0

奇妙な問題とその解決策の別の例:

この:

target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_LIBRARIES}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )

与える: make[3]: *** No rule to make target '/usr/lib/libPocoFoundationd.so', needed by '../hello_poco/bin/mac/HelloPoco'. Stop.

しかし、私がPoco_LIBRARIESそれを削除すると、うまくいきます:

target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )

Macでclang8を、Linuxでclang 3.9を使用しています。問題はLinuxでのみ発生しますが、Macでも機能します。

私は言及するのを忘れていました:Poco_LIBRARIES間違っていました-cmake / find_packageによって設定されていません!


0

私の場合、パスがVPATHに設定されていないため、エラーが追加されました。


0

このエラーにはいくつかの理由があります。

このエラーが発生した理由の1つは、LinuxとWindows用にビルドしているときです。

大文字のファイル名を持っていますBaseClass.h SubClass.h Unixは大文字と小文字を区別するファイル命名規則を維持し、ウィンドウは大文字と小文字を区別しません。

C ++なぜヘッダーファイルの名前に大文字を使用しないのですか?

gmakeを使用している場合は、gmake cleanを使用してクリーンビルドをコンパイルしてみてください。

一部のテキストエディタには、大文字と小文字を区別するファイル名を無視するデフォルト設定があります。これも同じエラーにつながる可能性があります。

Qt Creatorで名前が大文字で始まるc ++ファイルを追加する方法 自動的に小文字になります


0

このエラーは、新しいファイルをgitリポジトリに追加するのを忘れたときにTravis内で発生しました。ばかげた間違いですが、かなり一般的であることがわかります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.