Linux/Unix下makefile文件编写实例

本文介绍了一个用于构建动态库的Makefile实例,详细解释了宏定义、环境变量的应用及依赖关系的管理,帮助读者掌握Makefile的基本语法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做linux代码移植,刚刚学习了下makefile文件的编写,现将心得与大家分享。
一、Makefile的规则
在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。
target ... : prerequisites ...
command
...
...


target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签
(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisi
tes中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一
个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是 Makefi
le的规则。也就是Makefile中最核心的内容。
1.1 实例
cc=g++                                #编译器
lib=$(DMS_PUB)/lib/libdext.so                    #动态库生成目录
obj= datamgrimp.o datamgr.o                    #动态库依赖目标文件
inc=-I$(ACE_ROOT) -I$(TT_ROOT)/include -I$(OTL_ROOT) -I$(OCI_ROOT)/include -I$(DMS_PUB)/include -I./include        #编译依赖头文件目录
$(lib):$(obj)
    $(cc) -shared $(obj) -lc -o $(lib) -L$(ACE_ROOT)/lib -L$(TT_ROOT)/lib -L$(OCI_ROOT)/lib -L$(DMS_PUB)/lib -lACE -lttclasses -lociei -lzdevone
datamgrimp.o:./src/impdatamgr.cpp $(DMS_PUB)/include/efunctions.h ./include/impdatamgr.h                     #注意依赖文件的路径。该路径相对当前makefile文件所在的目录。
    $(cc) -fPIC $(inc) -c ./src/impdatamgr.cpp  -o datamgrimp.o                                                                        #前面是TAB所进
datamgr.o:./src/datamgr.cpp ./include/impdatamgr.h
    $(cc) -fPIC $(inc) -c ./src/datamgr.cpp -o datamgr.o
clean:
    rm -f *.o *.so


实例详解
上面是生成一个动态库的makefile文件。其中用到了宏定义,系统环境变量,引用第三方库。下面进行详细说明:
宏定义:makefile为了简化文件结果,支持宏定义。如上面文件中到cc、lib、obj等都是定义的宏。如果宏不超过一个字符,可以直接使用,如$c;如果超过一个字符,需要用括号扩起来,如$(lib)。
环境变量:在makefile文件里面可以使用系统的环境变量,但是使用时,需要注意,必须用括号扩起来,如$(DMS_PUB).
makefile文件里面不可以用空格。目标所使用的编译命令要用一个tab空格缩进。切忌要使用TAB键进行缩进!
############################################################################# # Makefile for building: sample 2011-09-26 # # Project: # Template: # Command: # ------基本上简单用法的makefile------- #1. 第一个目标为最终目标 #2. 命令以 Tab开头,可以有多个命令 #3. 分行号\ 后面不可以跟空格 #4、加@可以去掉命令显示 #5. 变量为 abc = efd 访问为 $(abc) echo $abc # # # #缺点,单文件夹 #每次都会重新生成 # #foo.o : foo.c defs.h # foo模块 #cc -c -g foo.c # #多目录 一种方法,在主目录里面include "",然后其里面OBJS += .o,这样其实就是 或用foreach ############################################################################# #target EXECUTABLE := test CC := gcc CXX := g++ STRIP := strip AR := ar cqs LINK := g++ RM := rm -f CFLAGS := -g -Wall CXXFLAGS := $(CFLAGS) CXXFLAGS += -MD LIBS := -lm LIBPATH := -L/usr/local/lib INCPATH := ####### Output directory OBJSPATH := ../Obj/ EXECUTABLEPATH := ../Execute/ #######source Files SOURCE := $(wildcard *.c) $(wildcard *.cpp) OBJS := $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(SOURCE))) DEPS := $(patsubst %.o,%.d,$(OBJS)) #######rule .SUFFIXES: .cpp .c .o .so .a .d $(OBJSPATH)%.o:%.c $(CC) $(CFLAGS) -c $< -o $@ $(OBJSPATH)%.o:%.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ $(OBJSPATH)%.d:%.cpp $(CXX) -MM $ $@ ######main .PHONY : all deps objs clean rebuild all: $(EXECUTABLE) $(CXX) $(CXXFLAGS) $(INCLUDEPATH) $(LIBS) $(LIBPATH) $(addprefix $(OBJSPATH),$(OBJS)) \ -o $(EXECUTABLEPATH)$(EXECUTABLE) deps: $(addprefix $(OBJSPATH),$(DEPS)) objs: $(addprefix $(OBJSPATH),$(OBJS)) clean: @$(RM) $(OBJSPATH)*.o @$(RM) $(OBJSPATH)*.d @$(RM) $(EXECUTABLEPATH)$(EXECUTABLE) rebuild: clean all -include $(addprefix $(OBJSPATH),$(DEPS)) ##.d里面是详细的.o rule 自己会括展开的,然后没有文件就自己去重建 $(EXECUTABLE) : objs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值