9

我有以下生成文件:

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

问题是只有该文件的一个命令正在执行,所以如果我想执行下一个<我必须删除或注释上一个命令。这个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

将构建这两个目标。或者,如果您希望make默认构建所有(或部分)目标,您可以在 Makefile 的开头指定一条规则,说明:

all: main.o DriveInfo.o …

现在,make all(或只是make)将构建所有依赖目标。all声明为虚假目标以告知make它与实际存在的文件不对应也是一种好习惯。通过放入.PHONY: allMakefile 来做到这一点。

最后一点,名称all是任意的。您可以在此处使用任何其他名称,但这all是常规名称。重要的部分是它是 Makefile 中的第一条规则,如果您希望它是在make没有任何明确目标的情况下调用时执行的规则。

于 2012-10-11T10:51:19.890 回答