我真的无法进入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,你知道吗?)%.o: %.c语法的东西,但是没有真正得到它)项目结构是:
bin (binary goes here!)
src
some
directories
are
here
Run Code Online (Sandbox Code Playgroud)
我不知道我是否需要目录文件的目录,我把它们放进去./bin,我觉得这很好,不是吗?
也许我只需要一个能用简单的词语解释它的人!
编辑:有人指出,没有真正的问题,所以在这里:
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)
我经常将该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 章)。