使所有C文件递归递归

时间:2013-01-29 18:21:23

标签: c makefile

我真的无法进入makefile。在以前的项目中,我在 Makefile

中硬编码了所有编译任务
all: compile_a compile_b compile_c

compile_a:
    ${CC} ${CFLAGS} ${A_SRC} -o ${A_OUT}

等等。

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

我想要的是什么:

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

项目结构是:

bin (binary goes here!)
src
  some
  directories 
  are
  here

我不知道是否需要目标文件的目录,我将它们放在./bin中,我认为这已经足够了,不是吗?

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

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

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

也许这有帮助。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:4)

我经常将wildcard函数与foreach函数结合使用,以实现您想要实现的目标。

如果您的来源位于src/,并且您希望将二进制文件放入bin/,则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)

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

答案 2 :(得分:-5)

如果没有详细说明makefile,请使用*来发挥优势。

compileAll:    gcc -c *.c
linkAll:       gcc *.o -o output.exe