2

``make ファイルを使用してアプリケーションを実行しようとすると、エラーが発生します。これは自分で make ファイルを作成する最初の試みであり、オンラインで多くの例を見つけましたが、私のものを動作させることができません。ただし、エラーはコンパイルエラーであり、手動でコンパイルしたものは取得できません。エラーは次のとおりです。

`dave@ubuntu:~/School/CS647/Programs/Homework4$ make
g++ -Wall -o StatWrapper StatWrapper.o tools.o
/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [StatWrapper] Error 1

` ここに私のmakeファイルがあります:

CC = g++
CFLAGS = -Wall
UTILDIR = ../../Utilities/
OBJECTS =  Sweeper.o FileID.o P4Ford.o DirentWrapper.o StatWrapper.o tools.o

all: StatWrapper DirentWrapper FileID Sweeper P4Ford

#P4Ford: $(OBJECTS)
#   $(CC) $(OBJECTS) -o P4Ford

DirentWrapper: DirentWrapper.o tools.o
    $(CC) $(CFLAGS) -o DirentWrapper DirentWrapper.o tools.o

StatWrapper: StatWrapper.o tools.o
    $(CC) $(CFLAGS) -o StatWrapper StatWrapper.o tools.o

P4Ford: P4Ford.o Sweeper.o
    $(CC) $(CFLAGS) -o P4Ford P4Ford.o Sweeper.o

Sweeper: Sweeper.o FileID.o StatWrapper.o DirentWrapper.o tools.o
    $(CC) $(CFLAGS) -o Sweeper Sweeper.o FileID.o StatWrapper.o DirentWrapper.o tools.o

FileID: FileID.o tools.o
    $(CC) $(CFLAGS) -o FileID FileID.o tools.o

#tools: tools.o
#   $(CC) $(CFLAGS) $(UTILDIR)tools.cpp

# dependencies ---------------------------------------------------
DirentWrapper.o: $(UTILDIR)DirentWrapper.cpp  $(UTILDIR)DirentWrapper.hpp
StatWrapper.o: $(UTILDIR)StatWrapper.cpp  $(UTILDIR)StatWrapper.hpp
P4Ford.o: P4Ford.cpp  Sweeper.hpp
Sweeper.o: Sweeper.cpp  FileID.hpp
FileID.o: FileID.cpp  $(UTILDIR)tools.hpp
tools.o: $(UTILDIR)tools.cpp $(UTILDIR)tools.hpp

# cleanup
clean:
    rm -f $(OBJECTS)

手動でコンパイルすると機能するため、これはメイクファイルの問題だと思いますが、確信が持てません。

前もって感謝します。

4

3 に答える 3

1

-cオブジェクトファイルを構築するルールに追加するだけです。これがないと、コンパイラは、main()定義が必要な実行可能ファイルを作成していると想定します。-cフラグは、まだリンクが行われていないことを示します。

于 2012-05-09T22:37:59.667 に答える
0
StatWrapper: StatWrapper.o tools.o
    $(CC) $(CFLAGS) -o StatWrapper StatWrapper.o tools.o

このルールでは、実行可能ファイルをリンクStatWrapper.otools.oて作成していますStatWrapper。どちらにもmain機能がないため、これは機能しません。

これらの無効なルールをすべて削除し、1 つだけ残す必要があります。これにより、すべてのオブジェクト ファイルが 1 つの実行可能ファイルに結合されます。

于 2012-05-09T22:24:41.583 に答える
0

オブジェクトファイルから始めましょう。Make には.cppファイルをコンパイルするための組み込みのルールがありますが、念のために (そして練習のために) ルールを記述します。

Sweeper.o: Sweeper.cpp FileID.hpp
    $(CC) $(CFLAGS) -c Sweeper.cpp -o Sweeper.o

先に進む前にこれをテストしてください。

そのルールには冗長性が見られるため、自動変数を使用して少しクリーンアップします。

Sweeper.o: Sweeper.cpp FileID.hpp
    $(CC) $(CFLAGS) -c $< -o $@

先に進む前にこれをテストしてください。

Sweeperコマンドが明示的に言及していないことに注意してください。他のオブジェクト ファイルのルールを記述すると、それらはすべて同じコマンドになります。したがって、それらを静的パターン ルールにまとめることができます。

OBJECTS =  Sweeper.o FileID.o P4Ford.o DirentWrapper.o StatWrapper.o tools.o

DirentWrapper.o: $(UTILDIR)DirentWrapper.cpp  $(UTILDIR)DirentWrapper.hpp
StatWrapper.o: $(UTILDIR)StatWrapper.cpp  $(UTILDIR)StatWrapper.hpp
P4Ford.o: P4Ford.cpp  Sweeper.hpp
Sweeper.o: Sweeper.cpp  FileID.hpp
FileID.o: FileID.cpp  $(UTILDIR)tools.hpp
tools.o: $(UTILDIR)tools.cpp $(UTILDIR)tools.hpp

$(OBJECTS) : %.o: %.cpp
    $(CC) $(CFLAGS) -c $< -o $@

これで、次のことができるはずですmake FileID.o

先に進む前にこれをテストしてください。

Make がオブジェクトのビルド方法を認識したので、それらを実行可能ファイルにリンクするためのルールが 1 つだけ必要です。

P4Ford: P4Ford.o Sweeper.o
    $(CC) $(CFLAGS) $^ -o $@ 

これを最初のルールにすると、Make はそれをデフォルトとして扱います。(そして、その 2 つのオブジェクト ファイルだけが必要であると確信していP4Fordますか? 多分そうあるべきですP4Ford: $(OBJECTS)。)

于 2012-05-09T22:56:57.207 に答える