当我练习时,我有一条练习路径。
在这条路径下,我有一个名为myInclude
的包含路径(我有一些有用的功能是这个文件夹,我总是使用它。)
一个名为symbol_try
的代码路径。我总是在symbol_try
中添加新文件夹(包含c文件和主函数)并编译它。
每次我都要通过终端中的gcc编译它。这是一个无聊的工作,所以我写了一个Makefile。
以下是一个例子:
实践路径中的主要Makefile:
FOBJS=
include myInclude/Rule.mk
include symbol_try/codeList_13.1/Rule.mk
symbol:$(FOBJS) <==What exactly I what . A executable file.
gcc -o symbol $(FOBJS) -pthread -lpthread
subsystem:
cd myInclude/ && $(MAKE)
cd symbol_try/codeList_13.1/ &&$(MAKE)
clean:
rm -rf symbol
在myInclude / Rule.mk
中FOBJS+=myInclude/otherFunction.o myInclude/error.o \
myInclude/unit.o myInclude/unitTest.o\
在symbol_try / codeList_13.1 / Rule.mk
中FOBJS+=symbol_try/codeList_13.1/codeList_13.1.o
在myInclude / Makefile中:
OBJS=otherFunction.o error.o unit.o unitTest.o
ALL:$(OBJS)
.PHONY:ALL
$(OBJS):%.o:%.c
gcc -c $< -o $@
clean :
otherFunction.o error.o unit.o
在symbol_try / codeList_13.1 / Makefile中:
codeList_13.1.o:codeList_13.1.c
gcc -c codeList_13.1.c
嗯。那可以。但是如你所见,我必须编写一个Rule.mk(初始化FOBJS)和每个文件夹的Makefile。
我是make的新手,我想找到一种更简洁的方法,我只需要为每个文件夹和一个主Makefile编写一个Makefile。不再有Rule.mk 。
PS:我总是更改myInclude中的代码,所以我不想将它构建为库。
感谢您的帮助。
答案 0 :(得分:1)
只需一个Makefile就可以实现这一点:
CC = gcc
CPPFLAGS += -I myInclude/ (1)
CFLAGS += -std=c99 -Wall (2)
VPATH = myInclude/ \ (3)
symbol_try/codeList_13.1/
symbol: otherFunction.o error.o unit.o unitTest.o codeList_13.1.o (4)
$(CC) -o $@ $^ (5)
.PHONY : clean
clean:
rm -f symbol *.o
请注意make
知道如何构建C文件并且有一些标准宏:CC,CPPFLGAS,CFLAGS
myInclude
目录中有单个目标文件的标题。symbol.c
的文件,您需要告诉如何使用规则创建symbol.o
。 $@
表示目标(此处为“符号”),$^
表示所有先决条件(列出的目标文件)。以下是我的测试目录中所有文件的列表:
$ find . -type f
.
./Makefile
./myInclude/error.c
./myInclude/header.h
./myInclude/otherFunction.c
./myInclude/unit.c
./myInclude/unitTest.c
./symbol_try/codeList_13.1/codeList_13.1.c
构建输出:
$ make
gcc -std=c99 -Wall -I myInclude/ -c -o otherFunction.o myInclude/otherFunction.c
gcc -std=c99 -Wall -I myInclude/ -c -o error.o myInclude/error.c
gcc -std=c99 -Wall -I myInclude/ -c -o unit.o myInclude/unit.c
gcc -std=c99 -Wall -I myInclude/ -c -o unitTest.o myInclude/unitTest.c
gcc -std=c99 -Wall -I myInclude/ -c -o codeList_13.1.o symbol_try/codeList_13.1/codeList_13.1.c
gcc -o symbol otherFunction.o error.o unit.o unitTest.o codeList_13.1.o
答案 1 :(得分:0)
为什么不从myInclude中的对象创建库,并在代码路径中的Makefile中进行链接(symbol_try / codeList_13.1)。无论如何后者更好,因为所需的库(在您的情况下为-pthread -lpthread
)可能也会改变其他一些代码。
现在,主要的Makefile无需做任何事情,只需在所有需要的子目录中调用make。
答案 2 :(得分:0)
在每个文件夹中都有一个带
的makefile SOURCES=sample.c sampletest.c
OBJECTS=$(SOURCES:%.c=$(OBJDIR)/%.o)
all: $(OBJECTS)
$(OBJDIR)/%.o: %.c
$(CC) $(CFLAGS) -o $@ $<
在项目的根目录中,创建一个带有规则的makefile,以编译每个子文件夹,如下所示。
Dirs= path-to-rootdir
objs:
set -e ; \
for i in $(Dirs) ; do \
$(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS_MODULE)" LDFLAGS="$(LDFLAGS)" OBJDIR="$(OBJDIR)" -C $$i; \
done
然后您可以使用它通过添加规则来构建可执行文件
EXE: objs
$(CC) -L./Path1 $(LIB_PATH) -llib1 -o $(EXE_NAME) $(wildcard $(OBJDIR)/*.o)
希望这有帮助!!!