编译包含多个目录的文件列表

标签 c makefile gnu-make

今天我一直在为这个问题绞尽脑汁。

我在很多目录中有很多c 文件。它们都需要编译并链接到库。

这是文件的假设布局:

main_dir/
  thing1/
    thing1.c
  thing2/
    thing2.c
  thing3/
    thing3.c
MakeFile

我有一个 makefile 可以“查找”这些文件并生成必要的对象,但是,始终使用相同的 c 文件作为输入。

这就是 Makefile 的样子(每个文件的内容都是一个使用 put() 的函数):

C=gcc
CFLAGS=-Wall -g
OBJDIR=obj
SRC=$(shell find src/ -type f -name "*.c")
SRC_DIRS=$(shell find src/ -type f -name "*.c" -exec dirname {} \; | uniq)
OBJS=$(SRC:%.c=${OBJDIR}/%.o)    

$(OBJS) : $(SRC)
    @echo Compiling : $<
    $(C) -c $(CFLAGS) -o $@ $<

clean:
    rm -fv $(OBJS) thingy.a

folders:
    $(call build_dirs)

all: folders $(OBJS)
    ar -r -o thingy.a $(OBJS)

define build_dirs
    for dir in $(SRC_DIRS); do \
        mkdir -pv $(OBJDIR)/$$dir; \
    done
endef

制作的输出:

for dir in src/thing1 src/thing2 src/thing3; do mkdir -pv obj/$dir; done
Compiling : src/thing1/thing1.c
gcc -c -Wall -g -o obj/src/thing1/thing1.o src/thing1/thing1.c
Compiling : src/thing1/thing1.c
gcc -c -Wall -g -o obj/src/thing2/thing2.o src/thing1/thing1.c
Compiling : src/thing1/thing1.c
gcc -c -Wall -g -o obj/src/thing3/thing3.o src/thing1/thing1.c
ar -r -o thingy.a obj/src/thing1/thing1.o obj/src/thing2/thing2.o obj/src/thing3/thing3.o
ar: creating thingy.a

我非常确定问题是我在中使用 $(SRC) $(OBJS) : $(SRC) 但是,我就是不知道该怎么办。

有 MakeFu 可以提供帮助吗?

最佳答案

您的 $(OBJS) 似乎设置正确,因此以下内容应该有效(而不是 $(OBJ) : $(SRC) 目标):

$(OBJDIR)/%.o : %.c
    @echo Compiling : $<
    $(C) -c $(CFLAGS) -o $@ $<

关于编译包含多个目录的文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12627992/

相关文章:

windows - cmake:指定编译器的问题

gradle - 并行化 GNU Makefile 等 gradle 任务

makefile - 使用 GNU-make 函数检查是否定义了变量

php - 从 PHP 执行程序挂起 APACHE

c - 按长度排序,在 c 中具有稳定性

c - 我该如何改进这个 Makefile?

c++ - qmake 生成的 Makefile 中缺少 QtWebKit 依赖项

C++ 未定义对库函数的引用

我们可以将预处理器指令视为 token 吗?

c - 当仍有大量交换空间时,malloc 失败