我正在用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"
发布于 2013-04-07 01:28:24
我想你想要的是制作依赖文件。
您可以指定编译器来使用'-MMD -MP‘参数为您生成一个依赖文件,该参数创建一个与源文件名称相同的新文件,除了扩展名*.d之外,该文件与您的源文件位于同一个文件夹中。
依赖文件包含代码所依赖的所有头部,这将导致GNU编译您使用的头文件的源文件。
启用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)发布于 2013-04-07 10:29:37
您没有说ed.c包含两个特定的标头,但如果它链接到对象,我想它必须包含。
这正是马凯普发挥其优势之一的场景:如果您遵循对需要链接的每个.o文件都有一个对应名称的包含语句(在您的例子中是client_UDP.h & server_UDP.h)的约定,那么makepp将发现它本身,除了将头文件检测为依赖项之外。
这甚至可以递归地工作,所以如果您有一个wrapHeader.c (在edit.c中没有对应的include语句),那么就会自动编译和链接。
所以不需要makefile。但是,如果您想避免每次调用makepp edit,则可以创建一个一行程序。
edit:如果您有更复杂的需求,您只需要学习make语法。但如果你这么做了,就没有限制了。除了完成几乎所有GNU制造的can之外,还有更多有用的东西,您甚至可以使用一些Perl编程来扩展makefile。
https://stackoverflow.com/questions/15857837
复制相似问题