我真的无法进入makefile。在以前的项目中,我在 Makefile :
中硬编码了所有编译任务all: compile_a compile_b compile_c
compile_a:
${CC} ${CFLAGS} ${A_SRC} -o ${A_OUT}
等等。
但是由于最新的项目比以前的每个项目都有更多文件,我想写更好的make任务,当然还有LESS角色因为make对我的眼睛并不友好(这让他们受苦) ! :-P
我想要的是什么:
make projectname
或make all
,你知道吗?)%.o: %.c
语法的内容,但没有真正得到它)项目结构是:
bin (binary goes here!)
src
some
directories
are
here
我不知道是否需要目标文件的目录,我将它们放在./bin
中,我认为这已经足够了,不是吗?
也许我只需要一个能用简单的词语解释它的人!
编辑: 有人指出,没有真正的问题,所以在这里:
bin/(filename).o
.o
个文件也许这有帮助。
答案 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