私は自分のプロジェクトをコンパイルするためにメイクファイルと一緒に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
これは通常、vertex.cpp
という名前のファイルを作成できないために発生します。それを確認します:
それ以外に、私は他に示唆すべきことはあまりありません。おそらくあなたは私たちにそのディレクトリのディレクトリ一覧を与えることができます。
私の経験では、このエラーは頻繁に スペル エラーによって引き起こされます。
今日このエラーになりました。
make [1]:***ターゲット
maintenaceDialog.cpp', needed by
maintenaceDialog.o 'を作成する規則はありません。やめる。
私の場合、エラーは単にスペルミスでした。 Word MAINTENANCEに3番目のNがありません。
ファイル名のスペルも確認してください。
このメッセージが表示される最も一般的な理由は、ソースファイルが存在するディレクトリを含めるのを忘れたためです。その結果、gccはこのファイルが存在しないと考えます。
Gccの-I引数を使用してディレクトリを追加できます。
私の場合は、区切り記号として頭にコンマを使用しました。あなたの例を使用するために、私はこれをしました:
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
それを修正しました。
それは正確ですか? Makefileの構文は空白を意識しており、アクションの下でコマンドをインデントするためのタブが必要です。
私が見つけた問題は、他の人々が言っていたものよりもさらに繊細でした。
私たちのmakefileは構築するもののリストを渡されます。以下のように、誰かがリストの1つにTheOtherLibrary
を追加しました。
LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary
彼らはこれをするべきだった:
LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary
彼らがそれを第二の方法でやれば、彼らはLibrary
ビルドを一掃しなかったでしょう。 +=
のプラスは非常に重要です。
私の場合、それは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
...
私の場合、エラーメッセージは古いファイル名を参照していましたが、名前が変更されたためにもう存在しません。古くなった情報は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
その後、建物はまたうまくいった。
よくある間違いの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
John the Ripper「bleeding-jumbo」をビルドしようとしたときに「make:***ターゲット 'linux-x86-64'を作成するためのルールがありません」のようなエラーが発生した場合。代わりにこのコマンドを実行してみてください。./configure && make
別の解決策は、実際には答えではありませんが、おそらくそこにいる誰かを助けることができるでしょう。私のケースで何が間違っていたのか私にはわかりません。問題はどこにもないところで一日に起こり、移動も名前の変更も、何も起こりませんでした。私は上記のすべての提案と解決策を試してみましたが、何も助けになりませんでした。そこで私は手動でビルドディレクトリ全体を削除し、Eclipseにmakefileとすべての* .mkファイルを再作成させました。
奇妙な問題とその解決策のもう一つの例:
この:
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によって設定されていませんでした。
私の場合、パスはVPATHに設定されていません、追加されたエラーが消えた後。
Sourceディレクトリを別の場所にコピーするだけでも、同じエラーが発生します。
私もBuildディレクトリを移動した後に解決しました。
このエラーには複数の理由があります。
私はこのエラーが発生した理由の一つは、LinuxとWindows用に構築している間です。
私は大文字のBaseClass.h SubClass.hを持つファイル名を持っています。Unixはファイル名の命名規則を大文字と小文字を区別し、windowsは大文字と小文字を区別しません。
Gmakeを使用している場合は、gmake cleanを使用してクリーンビルドをコンパイルしてみてください。
テキストエディタの中には、大文字と小文字を区別するファイル名を無視するようにデフォルト設定されているものがあります。これも同じエラーにつながる可能性があります。
Qt Creatorで名前が大文字で始まるc ++ファイルを追加するにはどうすればいいですか?それは自動的にそれを小文字にする
私のgitリポジトリに新しいファイルを追加するのを忘れたときに、このエラーがTravisの内部で発生しました。愚かな間違いですが、私はそれが非常に一般的であることがわかります。
私の場合、ソースや古いオブジェクトファイルは、半クラッシュしたIDEによって、または正常に動作しなくなったバックアップクラウドサービスによってロックされていました(読み取り専用)。フォルダ構造に関連付けられていたすべてのプログラムとサービスを再起動すると、問題は解決しました。