0

私はMakefilesに非常に慣れていないので、現在、開始しているプロジェクトで最初のMakefilesをビルドしようとしています。

私が抱えている問題は、各ファイルのルールを定義せずに、すべての.cppファイルを処理する方法を自動的に認識させることです。

また、オブジェクトファイルをすべて1つのフォルダー(この場合は$(PLATFORM)/obj/ where PLATFORM=win32)に配置する必要があります。

以下は、私がMakefileに使用しているもので、mingw32-make.exeを使用して実行します。

CXX=g++
CXXFLAGS=-c -Wall -DALLEGRO_STATICLINK
LDFLAGS=
PLATFORM=win32
SOURCES=main.cpp
EXECUTABLE=app.exe
OBJDIR=$(PLATFORM)/obj/
OBJECTS= $(SOURCES:%.cpp=$(OBJDIR)%.o)

all: $(EXECUTABLE)

%.o: %.c
    $(CXX) $(CXXFLAGS)  $< -o $@


$(EXECUTABLE): $(OBJECTS)
    $(CXX) $(OBJECTS) $(LDFLAGS) -o $(EXECUTABLE)

エラーが発生しました:

mingw32-make:*ターゲットwin32/obj/main.o', needed by app.exeを作成するルールはありません。止まる。

何が間違っているのかわかりません。他のmakefileの例を見回していて、それらは同様の構造を持っているように見えるので、私の何が悪いのかわかりません。なぜこれが起こっているのかについての説明と、それを修正する方法についてのアドバイスを探しています。
また、私のスタイルについてのコメント、それをよりクリーン/標準化するための提案も素晴らしいでしょう。makefileの作成を学びながら、適切に学習していることを確認したいと思います。

ありがとう

4

2 に答える 2

0

手動のmakefileの使用を思いとどまらせたくはありませんが、問題を完全に解消したい場合は、makefileを生成するautotoolsを利用できます。Windowsを使用しているので、cygwin(またはおそらくMingGW)を使用していると思われます。cygwinの場合は、autotoolsバイナリパッケージをダウンロードするだけです。IDEにEclipseを使用している場合(私はこれを強く推奨します)、autotoolsで取得するように環境を構成できます。このように、あなたはただコードを書くことに集中します。すべての構成可能オプションはまだ存在しますが、makeを知る必要はありません。

于 2012-12-02T01:12:48.527 に答える
0

makeを作成する必要があるwin32/obj/main.oことを確認しましたが、その方法を指示するルールを確認できません。

3つのルールがあります。1つは、、allもう%.o1つは$(EXECUTABLE)。です。最初のものと最後のものはmake、作成方法を教えてくれませんwin32/obj/main.o

2番目のルールはおそらくそうすべきですが、これは次のように述べています。作成する場合は<something>.o、最初にというファイルがあることを確認します<something>.c(ファイルが存在しない場合は、作成するルールを見つけてください)。次に、次のコマンドを実行します。$(CXX) ...

ただし、ファイルの<something>.c末尾が。であるため、ファイルは存在しません.cpp。したがって、このルールは失敗します。make構築する他のルールが見つからないためwin32/obj/main.o、あきらめます。

%.o要約すると、に依存するようにルールを変更する必要があります。%.cppそうするとmake、コマンドを実行してオブジェクトファイルを作成できるようになります。したがって、ルールは次のようになります。

%.o: %.cpp
    $(CXX) $(CXXFLAGS)  $< -o $@

ちなみに、make事前定義された暗黙のルールもあります。明示的なルールを指定すると、%.o実際には事前定義されたルールが上書きされます。ある時点で、このルールをまったく与えないようにして(ただし、定義CXXしてCXXFLAGS)、何が起こるかを確認することをお勧めします。詳細はこちらをご覧ください。

于 2012-12-02T01:14:15.123 に答える