gpt4 book ai didi

c - 在 make 文件中包含多个子目录

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:07 29 4
gpt4 key购买 nike

我正在尝试为我在 Linux 下用 C 编写的小型应用程序编写一个 makefile。目前我所有的源文件 .c 都在顶层目录中,所有头文件都在一个包含目录。这是我为此使用的 makefile。

IDIR =include
CC=gcc
CFLAGS=-I$(IDIR)


ODIR=obj

_OBJ = main.o kernel.o user_app.o myargs.o ofp_msgs.o pkt_ip.o pkt_ether.o pkt_tcp.o pkt_udp.o pkt_icmp.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))

#DEPS = ofp_msgs.h




$(ODIR)/%.o: %.c
$(CC) -c -o $@ $< $(CFLAGS)
all: jam

jam: $(OBJ)
gcc -o $@ $^ $(CFLAGS) -lpthread

.PHONY: clean

clean:
rm -f $(ODIR)/*.o *~ jam

它工作正常,但我想要的是,例如我创建一个名为 "Packet" 的子目录和我所有的数据包解析文件,即 "pkt_ip.c、pkt_tcp.c 等" 应该在那个目录中,因为它们的头文件仍然应该在顶级目录中 i-t "toplevel/include"。我做了一些搜索,最常见的方法是使用递归 make。然后我看到很多页面提示递归 make。任何人都可以帮我解决这个问题吗?谢谢

最佳答案

我建议查看 Recursive Make Considered Harmful 中描述的方法.我已经在多个项目(小型到中型)中使用过它,发现它比递归方法更易于使用,也更容易理解。

基本上,您在根目录中有一个 Makefile,其中包含来自每个子目录的(部分)makefile:

SRC := main.c
MODULES := Packet lib etc
-include $(patsubst %, %/module.mk, $(MODULES))

OBJ := $(patsubst %.c, %.o, $(filter %.c,$(SRC)))
# (...)

包/模块.mk:

SRC += Packet/pkt_ip.c Packet/pkt_tcp.c
LIBS += -lsome_library

这些模块 makefile 当然也可以定义自己的模块目标,或特殊的构建要求。

与递归 make 不同,“make”只会被调用一次,这对于大多数用例来说会导致更快的构建。但是,对于大多数较小的项目,构建时间和复杂性都不是主要问题,因此请使用感觉最自然的东西。

关于c - 在 make 文件中包含多个子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10189931/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com