使用makefile编译头依赖项
我正在用C编程语言编写UDP客户端服务器应用程序; 我想在依赖项发生变化时自动编译2个源文件和3个头文件,所以我决定使用make实用程序。
makefile目标称为“编辑” :
edit : server_UDP.o client_UDP.o \ gcc -o edit server_UDP.o client_UDP.o \ client_UDP.o : client_UDP.c cliHeader_UDP.h wrapHeader.h gcc -c client_UDP.c server_UDP.o : server_UDP.c servHeader_UDP.h wrapHeader.h gcc -c server_UDP.c
当我在wrapHeader.h中更改几行代码时,它不会触发重新编译。
当wrapHeader.h中有更改以重新编译server_UDP和client_UDP时,如何修改编辑makefile规则?
**注意 :wrapHeader.h是主标题
cliHeader_UDP.h:包含“wrapHeader.h”
servHeader_UDP.h:包含“wrapHeader.h”
我想你想要的是Make依赖文件。
您可以使用’-MMD -MP’参数指定编译器为您生成依赖文件,该参数创建一个与源文件同名的新文件,但扩展名为* .d,与源文件夹在同一文件夹中。
依赖项文件包含代码所依赖的所有头文件,如果修改了它使用的头文件,这将导致GNU make编译源文件。
启用makefile的示例依赖项文件:
# Makefile CC := gcc LD := g++ # The output executable. BIN := program # Toolchain arguments. CFLAGS := CXXFLAGS := $(CFLAGS) LDFLAGS := # Project sources. C_SOURCE_FILES := mysourcefile1.c src/myothersrc.c C_OBJECT_FILES := $(patsubst %.c,%.o,$(C_SOURCE_FILES)) # The dependency file names. DEPS := $(C_OBJECT_FILES:.o=.d) all: $(BIN) clean: $(RM) $(C_OBJECT_FILES) $(DEPS) $(BIN) rebuild: clean all $(BIN): $(C_OBJECT_FILES) $(LD) $(C_OBJECT_FILES) $(LDFLAGS) -o $@ %.o: %.c $(CC) -c -MMD -MP $< -o $@ $(CFLAGS) # Let make read the dependency files and handle them. -include $(DEPS)
这应该适合您的情况:
SOURCES := server_UDP.c client_UDP.c OBJECTS := $(patsubst %.c,%.o,$(SOURCES)) DEPS := $(OBJECTS:.o=.d) edit: $(OBJECTS) gcc -o edit $(OBJECTS) %.o: %.c gcc -c $< -o $@ -include $(DEPS)
你没有说edit.c包含你的两个特定的标题,但我想它必须,如果它链接到对象。
这正是makepp发挥其优势之一的情况:如果你遵循惯例,你需要链接的每个.o
文件都有一个相应名称的include语句(在你的情况下是client_UDP.h
和server_UDP.h
)然后makepp将自己想出一切,除了将头文件检测为依赖。
这甚至可以递归地工作,所以如果你有一个wrapHeader.c
(在wrapHeader.c
中没有相应的include语句),那将自动编译和链接。
所以你不需要makefile 。 但是如果你想避免每次都调用makepp edit
,那么你可以创建一个单行
edit:
如果您有更复杂的要求,您只需要学习make语法。 但如果你这样做,没有限制。 除了做几乎所有GNU make之外,还有更多有用的东西,你甚至可以通过一些Perl编程扩展你的makefile。