9

私は次のmakefileを持っています:

main.o: ServerSocket/main.cpp ../Shared/socket.h 
    g++ -c ServerSocket/main.cpp  -lstdc++

DriveInfo.o: ServerSocket/DriveInfo.cpp ServerSocket/DriveInfo.h ServerSocket/Consts.h
    g++ -c ServerSocket/DriveInfo.cpp  -lstdc++

ProcessInfo.o: ServerSocket/ProcessInfo.cpp ServerSocket/ProcessInfo.h ServerSocket/Consts.h
    g++ -c ServerSocket/ProcessInfo.cpp  -lstdc++

thread_pool.o: ServerSocket/thread_pool.cpp ServerSocket/thread_pool.h 
DriveInfo.o ProcessInfo.o thread_pool.o
server: main.o 
    g++ -o server main.o 
DriveInfo.o ProcessInfo.o thread_pool.o

問題は、そのファイルの1つのコマンドしか実行されていないことです。したがって、次のコマンドを実行する場合は、前のコマンドを削除またはコメントする必要があります。このmakefileの何が問題になっていますか?

4

2 に答える 2

23

デフォルトで、指定する最初のルールを実行します。

提供するすべてのルールを実行するルールを作成する

all : main.o DriveInfo.o ProcessInfo.o thread_pool.o

Makefileの先頭に配置するか、で呼び出しますmake all

于 2012-10-11T10:50:43.313 に答える
5

これは仕様によるものです。make構築するターゲットを指定できます。

make main.o DriveInfo.o

これらの2つのターゲットを構築します。または、デフォルトですべて(または一部)のターゲットをビルドする場合は、Makefileの先頭にmake次のようなルールを指定できます。

all: main.o DriveInfo.o …

これで、make all(または単にmake)すべての依存ターゲットを構築します。allまた、偽のターゲットとして宣言しmakeて、実際に存在するファイルに対応していないことを示すこともお勧めします。.PHONY: allMakefileを入れてこれを行います。

最後に、名前allは任意です。ここでは他の名前を使用できますが、all従来の名前です。重要なのは、明示的なターゲットなしで呼び出したときに実行されるルールにしたい場合は、Makefileの最初のルールであるということです。make

于 2012-10-11T10:51:19.890 に答える