开发中常常有这样的需求:一个不算简单的目录结构,需要一个统一的Makefile来进行编译管理。这时候最简单的做法就是遍历--搜罗所有的头文件和代码文件,使用统一的规则gcc -Ixx -o *.o *.c 其实Makefile提供了很多方法(函数)来方便懒人的,下面有个小例子: LIBS= -L/usr/lib \ -L../MicroSip6.0 \ -L./lib \ -lssl \ -lcrypto \
ARCH= MW_DIR=$(PWD) CC = $(ARCH)gcc LD = $(ARCH)ld AS = $(ARCH)as CPP = $(ARCH)g++ AR = $(ARCH)ar
MW_DIR=. INCLUDE = -I. 然后,我希望找到所有编译目录下的头文件-- SAMDIR=$(MW_DIR) SAMINCH=$(shell find $(SAMDIR) -name "*.h*") :::找到了,大家可以看到Makefile是可以使用shell命令的,现在结果存储在SAMINCH。 TMPDIR=$(dir $(SAMINCH)) dir是个函数,就是列出SAMINCH目录前缀(/*.h之前的字串)的结果。 SAMINCDIR=$(sort $(TMPDIR)) sort也是个函数,这是为了去除重复的目录名。 INCLUDE += $(foreach temp, $(SAMINCDIR), -I$(temp)) 只是列出所有匹配的目录结果, 加到-I选项之后,用空格隔开。 结果类似:-I./1 -I./2..... 如果引用本目录之外的头文件,没办法了,手动加上吧: INCLUDE += -Iaa/bb/vv 好了,轮到源程序了。 SRC=$(shell find $(SAMDIR)/src -path ./src/util/system/mac -name '*.cpp') 这个很简单,就是用shell find命令找到本目录下所有的.cpp文件(c,java同理) 但是,碰上我不想编译的目录怎么办呢?比如在Linux上碰到win32的系统代码,上一条命令可以改为: SRC=$(shell find $(SAMDIR)/src -path ./src/util/system/win32 -prune -o -name '*.cpp') 这就把不需要的路径跳过去了。 APP=$(SRC:%.cpp=%.o) 建立规则 下面实际的编译过程加上: all: control
$(APP): %.o: %.cpp $(CC) $(CFLAGS) $(INCLUDE) $< -o $@
#for possible C complie in the future #$(APPC): %.o: %.c # $(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@
control: clean $(APP) $(CPP) -m32 -o $@ $(INCLUDE) $(APP) clean: rm -fr $(APP) rm -f control 打完收工。 |
|
来自: Runs丶SS11 > 《MakeFile》