使所有C文件递归递归

mus*_*tze 10 c makefile

我真的无法进入makefile.在以前的项目中,我在Makefile中硬编码了所有编译任务:

all: compile_a compile_b compile_c

compile_a:
    ${CC} ${CFLAGS} ${A_SRC} -o ${A_OUT}
Run Code Online (Sandbox Code Playgroud)

等等.

但是由于最新的项目比以前的每个项目都有更多的文件,我想写更好的make任务,当然还有LESS角色因为make对我的眼睛不太友好(这让他们受苦)!:-P

我想要的是:

  • 统治他们的一项任务(只是make projectname或者make all,你知道吗?)
  • 每个C文件都要编译一个任务(我读了一些关于这个%.o: %.c语法的东西,但是没有真正得到它)
  • 链接的一项任务(如何获取所有.o文件并链接它们而不对每个文件进行硬编码?)
  • 一个清洁任务(哦,我可以这样做!)

项目结构是:

bin (binary goes here!)
src
  some
  directories 
  are
  here
Run Code Online (Sandbox Code Playgroud)

我不知道我是否需要目录文件的目录,我把它们放进去./bin,我觉得这很好,不是吗?

也许我只需要一个能用简单的词语解释它的人!

编辑:有人指出,没有真正的问题,所以在这里:

  • 如何递归编译所有C文件 bin/(filename).o
  • 如何.o在不知道名字的情况下链接'bin /'中的所有文件

也许这有帮助.

小智 11

试试这个:

CC = gcc
CFLAGS = -c -Wall -g -Os
LD = $(CC)
LDFLAGS = -lfoo

TARGET = MyProject

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))

all: $(TARGET)

$(TARGET): $(OBJECTS)
        $(LD) -o $@ $^ $(LDFLAGS)

# You don't even need to be explicit here,
# compiling C files is handled automagically by Make.
%.o: %.c
        $(CC) $(CFLAGS) $^ -o $@

clean:
        rm $(TARGET) $(OBJECTS)
Run Code Online (Sandbox Code Playgroud)

  • 这并没有完全回答 OP 的问题,该问题要求*递归* Makefile。这只会编译顶级文件夹中的所有内容。 (3认同)
  • @JamieBullock 这很容易解决:可以使用 `$(shell find . -name "*.c")` 代替 `$(wildcard ...)`。 (2认同)

use*_*332 6

我经常将该wildcard功能与该foreach功能结合使用来实现您想要实现的功能。

如果您的来源在,src/并且您想将二进制文件放入bin/my 的基本结构中,则Makefile如下所示:

SOURCES=$(shell find src -type f -iname '*.c')

OBJECTS=$(foreach x, $(basename $(SOURCES)), $(x).o)

TARGET=bin/MyProject

$(TARGET): $(OBJECTS)
    $(CC) $^ -o $@

clean:
    rm -f $(TARGET) $(OBJECTS)
Run Code Online (Sandbox Code Playgroud)

我通常利用 make 内置的隐式规则和预定义变量(Make 手册,第 10 章)。