使用makefile编译头依赖项

时间:2013-04-07 01:15:53

标签: c gcc makefile gnu

我正在使用C编程语言编写UDP客户端服务器应用程序;我希望每当依赖项发生变化时自动编译2个源文件和3个头文件,所以我决定使用make实用程序。

makefile目标名为“edit”

    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规则?

** note :wrapHeader.h是主标题

cliHeader_UDP.h:包含“wrapHeader.h”

servHeader_UDP.h:包含“wrapHeader.h”

2 个答案:

答案 0 :(得分:2)

我认为你想要的是制作依赖文件。

您可以使用'-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)

答案 1 :(得分:0)

你没有说edit.c包含你的两个特定标题,但我想它必须,如果它链接到对象。

这正是makepp发挥其优势之一的情况:如果遵循约定,您需要链接的每个.o文件都有一个相应名称的include语句(in你的情况是client_UDP.h&amp; server_UDP.h)然后makepp将自己解决所有问题,除了将头文件检测为依赖项。

这甚至可以递归地工作,所以如果你有一个wrapHeader.cedit.c中没有相应的include语句),那就会自动编译和链接。

所以你不需要makefile 。但是如果你想避免每次都调用makepp edit,那么你可以创建一个单行

edit:

如果您有更复杂的要求,您只需要学习make语法。但如果你这样做,就没有限制。除了做几乎所有GNU make之外,还有更多有用的东西,你甚至可以通过一些Perl编程扩展你的makefile。