0

昨日、Linuxでmakefileプロジェクトをコンパイルしました。これでプロジェクトはコンパイルされず、makefile自体に変更を加えたことを思い出せません。make: *** No rule to make target 'obj/TranquilMain.o', needed by 'tranquil;. Stop.でエラーをスローしますmake。私が行った唯一の実際の変更は、コードとmakefileを別のプロジェクトからコピーしたときに、特定のファイル(および依存関係を含む)の名前を変更してから、makefileのを変更したこと_DEPSです。必要な場所にあるすべてのファイル。

_OBJリストからTranquilMain.o以外のすべてのファイルを削除すると、正常にコンパイルされることに注意してください。enter code hereコードとこの知識以上のものを提供できればいいのですが、問題が何であるかはわかりません。

適切なMakefile:「makefile」

#!/usr/bin/make

CC      = gcc
CP      = g++

SRC_DIR     = #.
OBJ_DIR     = obj
INC_DIR     = ../include
LIB_DIR     = ../lib

LIBS        = -lm -lSDL -lSDLmain -lSDL_image -lSDL_mixer -lSDL_ttf -lSDL_net -lGL -lGLU -lGLEW
CFLAGS      = -I$(INC_DIR) -L$(LIB_DIR) -std=gnu++0x


_DEPS   = DefaultConfig.h BaseApplication.h BasePlugin.h SDLImage.h SDLFont.h SDLWindow.h SDLInput.h SDLRenderer.h SDLApplication.h Math2D.h SDLTimer.h
DEPS    = $(patsubst %,$(INC_DIR)/%,$(_DEPS))

_OBJ    = TranquilMain.o BaseApplication.o BasePlugin.o SDLImage.o SDLFont.o SDLWindow.o SDLInput.o SDLRenderer.o SDLApplication.o Math2D.o SDLTimer.o
OBJ = $(patsubst %,$(OBJ_DIR)/%,$(_OBJ))


$(OBJ_DIR)/%.o: %.cpp $(DEPS)
    $(CP) -c -o $@ $< $(CFLAGS)

tranquil: $(OBJ)
    $(CP) -o ../bin/$@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean
clean:
    rm -f $(OBJ_DIR)/*.o *~ core $(INC_DIR)/*~

明らかに役に立たないTranquilMain.cpp(依存関係の最初のファイルのみ)

#include <iostream>
#include <fstream>
#include <string>


int main( int argc, char* args[] )
{
    bool running = true;

    while( running == true )
    {
    }

    return 0;
}
4

2 に答える 2

2

上記のMakefileとプロジェクト構造から始めると

├── include/
└── src/
    ├── Makefile
    ├── TranquilMain.cpp
    └── obj/

次に、上記で報告したのと同じmake: *** No rule to make target `obj/TranquilMain.o', needed by `tranquil'.エラーが発生します。これの原因は何ですか?makeをデバッグモードで実行して調べてみましょう。

最初に追加

.SUFFIXES:
%:: SCCS/s.%
%:: RCS/%
%:: RCS/%,v
%:: %,v
%:: s.%

Makefileの先頭に移動して、デバッグ出力を乱雑にするだけのデフォルトのルールをキャンセルします。

次に、実行しますmake -d

GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.3.0
Reading makefiles...
Reading makefile `Makefile'...
Updating makefiles....
 Considering target file `Makefile'.
  Looking for an implicit rule for `Makefile'.
  No implicit rule found for `Makefile'.
  Finished prerequisites of target file `Makefile'.
 No need to remake target `Makefile'.
Updating goal targets....
Considering target file `tranquil'.
 File `tranquil' does not exist.
  Considering target file `obj/TranquilMain.o'.
   File `obj/TranquilMain.o' does not exist.
   Looking for an implicit rule for `obj/TranquilMain.o'.
   Trying pattern rule with stem `TranquilMain'.
   Trying implicit prerequisite `TranquilMain.cpp'.
   Trying rule prerequisite `../include/DefaultConfig.h'.
   Trying pattern rule with stem `TranquilMain'.
   Trying implicit prerequisite `TranquilMain.cpp'.
   Trying rule prerequisite `../include/DefaultConfig.h'.
   Looking for a rule with intermediate file `../include/DefaultConfig.h'.
    Avoiding implicit rule recursion.
   No implicit rule found for `obj/TranquilMain.o'.
   Finished prerequisites of target file `obj/TranquilMain.o'.
  Must remake target `obj/TranquilMain.o'.
make: *** No rule to make target `obj/TranquilMain.o', needed by `tranquil'.  Stop.

makeまず、Makefileが最新であることを確認します。tranquil次に、深さ優先探索を実行してターゲットを作成しようとし、必要なすべての依存関係を構築します。tranquilに依存し${OBJ}、その最初の要素はですobj/TranquilMain.o。規則により、それはとすべてに${OBJDIR}/%.o依存します。の最初の要素はですので、それを構築しようとします。しかし、それは存在せず、それを構築するためのルールはありません。依存関係が欠落しているため、このルールを使用してビルドすることはできないと結論付けます。存在する他の依存関係を使用してそれを構築するための別のルールを見つけようとしますが、そのようなルールはありません。それで、「ターゲットを作成するための[依存関係が存在する、または構築できる][有効な]ルールはありません。」と言って停止します。</p> TranquilMain.cpp${DEPS}${DEPS}../include/DefaultConfig.hmakemakeobj/TranquilMain.omakeobj/TranquilMain.o

解決策は何ですか?すべての依存関係が存在することを確認してください。このMakefileを使用して、何かをコンパイルするには、プロジェクトに少なくとも次のものが含まれている必要があります。

.
├── include/
│   ├── BaseApplication.h
│   ├── BasePlugin.h
│   ├── DefaultConfig.h
│   ├── Math2D.h
│   ├── SDLApplication.h
│   ├── SDLFont.h
│   ├── SDLImage.h
│   ├── SDLInput.h
│   ├── SDLRenderer.h
│   ├── SDLTimer.h
│   └── SDLWindow.h
├── lib/
└── src/
    ├── BaseApplication.cpp
    ├── BasePlugin.cpp
    ├── Makefile
    ├── Math2D.cpp
    ├── SDLApplication.cpp
    ├── SDLFont.cpp
    ├── SDLImage.cpp
    ├── SDLInput.cpp
    ├── SDLRenderer.cpp
    ├── SDLTimer.cpp
    ├── SDLWindow.cpp
    ├── TranquilMain.cpp
    └── obj/

lib/また、最終的な実行可能ファイルを取得するには、にライブラリファイルを追加する必要があります。

于 2012-11-29T16:41:27.473 に答える
1

また、誤ってタブを空白に変えていないことを確認してください。

ルールは「タブ」で始まらなければなりません:

#BAD!
tranquil: $(OBJ)
<space><space>$(CP) -o ../bin/$@ $^ $(CFLAGS) $(LIBS)

#GOOD!
tranquil: $(OBJ)
<tab>$(CP) -o ../bin/$@ $^ $(CFLAGS) $(LIBS)
于 2012-11-29T17:18:45.090 に答える