12

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

all: compile_a compile_b compile_c

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

等等。

但是由于最新的项目比以前的每个项目都有更多的文件,我想写更好的 make 任务,当然少字符作为 make 对我的眼睛不是很友好(这让他们很痛苦)!:-P

我想要的是:

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

项目结构为:

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

我不知道我是否需要一个目标文件的目录,我把它们放进去./bin,我认为这已经足够了,不是吗?

也许我只需要一个可以用简单的话解释的人!

编辑:正如有人指出的那样,没有真正的问题,所以这里是:

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

也许这有帮助。

4

3 回答 3

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)
于 2013-01-29T18:31:57.080 回答
7

我经常将该功能与您想要实现的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)

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

于 2013-01-29T18:58:21.013 回答
-5

无需详细说明 makefile,请使用 * 对您有利。

IE

compileAll:    gcc -c *.c
linkAll:       gcc *.o -o output.exe
于 2013-01-29T18:31:04.120 回答