首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用makefile编译头依赖项

用makefile编译头依赖项
EN

Stack Overflow用户
提问于 2013-04-07 01:15:53
回答 2查看 8.8K关注 0票数 4

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

makefile目标称为“编辑”

代码语言:javascript
复制
    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"

EN

回答 2

Stack Overflow用户

发布于 2013-04-07 01:28:24

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

您可以指定编译器来使用'-MMD -MP‘参数为您生成一个依赖文件,该参数创建一个与源文件名称相同的新文件,除了扩展名*.d之外,该文件与您的源文件位于同一个文件夹中。

依赖文件包含代码所依赖的所有头部,这将导致GNU编译您使用的头文件的源文件。

启用makefile的示例依赖文件:

代码语言:javascript
复制
# 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)

这应该适用于您的情况:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2013-04-07 10:29:37

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

这正是马凯普发挥其优势之一的场景:如果您遵循对需要链接的每个.o文件都有一个对应名称的包含语句(在您的例子中是client_UDP.h & server_UDP.h)的约定,那么makepp将发现它本身,除了将头文件检测为依赖项之外。

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

所以不需要makefile。但是,如果您想避免每次调用makepp edit,则可以创建一个一行程序。

代码语言:javascript
复制
edit:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15857837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档