web-dev-qa-db-ja.com

gcc makefileエラー: "ターゲットを作成する規則がありません..."

私は自分のプロジェクトをコンパイルするためにメイクファイルと一緒にGCC(linux)を使おうとしています。

この文脈では解読できないような、次のようなエラーが出ます。

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

これがmakefileです。

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
313
Meir

これは通常、vertex.cppという名前のファイルを作成できないために発生します。それを確認します:

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

それ以外に、私は他に示唆すべきことはあまりありません。おそらくあなたは私たちにそのディレクトリのディレクトリ一覧を与えることができます。

375
paxdiablo

私の経験では、このエラーは頻繁に スペル エラーによって引き起こされます。

今日このエラーになりました。

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

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

ファイル名のスペルも確認してください。

66
Wes

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

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

24

私の場合は、区切り記号として頭にコンマを使用しました。あなたの例を使用するために、私はこれをしました:

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

それを修正しました。

12
Nick Knowlson

それは正確ですか? Makefileの構文は空白を意識しており、アクションの下でコマンドをインデントするためのタブが必要です。

9
workmad3

私が見つけた問題は、他の人々が言っ​​ていたものよりもさらに繊細でした。

私たちのmakefileは構築するもののリストを渡されます。以下のように、誰かがリストの1つにTheOtherLibraryを追加しました。

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

彼らはこれをするべきだった:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

彼らがそれを第二の方法でやれば、彼らはLibraryビルドを一掃しなかったでしょう。 +=のプラスは非常に重要です。

7
kmort

私の場合、それは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
uluorta

私の場合、エラーメッセージは古いファイル名を参照していましたが、名前が変更されたためにもう存在しません。古くなった情報は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

その後、建物はまたうまくいった。

3
Philipp Claßen

よくある間違いの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.

正直に言うと メッセージはまったく間違っています 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
2
Nick Roz

John the Ripper「bleeding-jumbo」をビルドしようとしたときに「make:***ターゲット 'linux-x86-64'を作成するためのルールがありません」のようなエラーが発生した場合。代わりにこのコマンドを実行してみてください。./configure && make

2
Ogglas

別の解決策は、実際には答えではありませんが、おそらくそこにいる誰かを助けることができるでしょう。私のケースで何が間違っていたのか私にはわかりません。問題はどこにもないところで一日に起こり、移動も名前の変更も、何も起こりませんでした。私は上記のすべての提案と解決策を試してみましたが、何も助けになりませんでした。そこで私は手動でビルドディレクトリ全体を削除し、Eclipseにmakefileとすべての* .mkファイルを再作成させました。

0
Flot2011

奇妙な問題とその解決策のもう一つの例:

この:

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
Mike Mitterer

私の場合、パスはVPATHに設定されていません、追加されたエラーが消えた後。

0
tzuhsun

Sourceディレクトリを別の場所にコピーするだけでも、同じエラーが発生します。

私もBuildディレクトリを移動した後に解決しました。

0
Hareen Laks

このエラーには複数の理由があります。

私はこのエラーが発生した理由の一つは、LinuxとWindows用に構築している間です。

私は大文字のBaseClass.h SubClass.hを持つファイル名を持っています。Unixはファイル名の命名規則を大文字と小文字を区別し、windowsは大文字と小文字を区別しません。

C++なぜヘッダーファイルの名前に大文字を使わないのか

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

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

Qt Creatorで名前が大文字で始まるc ++ファイルを追加するにはどうすればいいですか?それは自動的にそれを小文字にする

0
corning

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

0
Ryan Deschamps

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

0
sskoog