最近做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 动态库实例
代码存放路径为:dext/include 和dext/src 分别存放头文件和实现文件。makefile文件存放在dext目录。
CC=g++ #编译器
OBJ=$(DMS_PUB)/lib/libdext.so #动态库生成目录
OBJS= impdatamgr.o datamgr.o #动态库依赖目标文件
INCPATH=-I$(ACE_ROOT) -I$(TT_ROOT)/include -I$(OTL_ROOT) -I$(OCI_ROOT)/include -I$(DMS_PUB)/include -I./include #编译依赖头文件目录
LIBPATH=-L$(ACE_ROOT)/lib -L$(TT_ROOT)/lib -L$(OCI_ROOT)/lib -L$(DMS_PUB)/lib
LIBS=-lACE -lttclasses -lociei -lzdevone
FLAGS=-c -g -fPIC
VPATH=./src/#定义依赖文件的搜索路径。该路径只能在依赖文件中使用,不可用于编译到源文件搜索路径。
SRC=./src/
$(OBJ):$(OBJS)
$(CC) -shared $(OBJS) -lc -o $(OBJ)
impdatamgr.o:impdatamgr.cpp
$(CC) $(FLAGS) $(INCPATH) $(SRC)impdatamgr.cpp
datamgr.o:datamgr.cpp
$(CC) $(FLAGS) $(INCPATH) $(SRC)datamgr.cpp
clean:
rm -f *.o *.so
1.2 可执行程序实例
CC=g++ #编译器
OBJ=$(DMS_ROOT)/bin/ds #目标生成目录
FLAGS=-c -g
OBJS= DataFilesHandler.o DataStorage.o DbOperator.o HeartbeatSender.o HostbakSwitcher.o #目标依赖目标文件
INCPATH=-I$(ACE_ROOT) -I$(OTL_ROOT) -I$(OCI_ROOT)/include -I$(DMS_PUB)/include -I./include #编译依赖头文件目录
LIBPATH=-L$(ACE_ROOT)/lib -L$(OCI_ROOT)/lib -L$(DMS_PUB)/lib
LIBS=-lACE -lociei -lzdevone
VPATH=./src/
SRC=./src/
$(OBJ):$(OBJS)
$(CC) -o $@ $^ $(LIBPATH) $(LIBS)
DataFilesHandler.o:DataFilesHandler.cpp
$(CC) $(INCPATH) $(FLAGS) $(SRC)DataFilesHandler.cpp
DataStorage.o:DataStorage.cpp
$(CC) $(INCPATH) $(FLAGS) $(SRC)DataStorage.cpp
DbOperator.o:DbOperator.cpp
$(CC) $(INCPATH) $(FLAGS) $(SRC)DbOperator.cpp
HeartbeatSender.o:HeartbeatSender.cpp
$(CC) $(INCPATH) $(FLAGS) $(SRC)HeartbeatSender.cpp
HostbakSwitcher.o:HostbakSwitcher.cpp
$(CC) $(INCPATH) $(FLAGS) $(SRC)HostbakSwitcher.cpp
clean:
rm -f *.o
实例详解
上面是生成一个动态库的makefile文件。其中用到了宏定义,系统环境变量,引用第三方库。下面进行详细说明:
宏定义:makefile为了简化文件结果,支持宏定义。如上面文件中到cc、lib、obj等都是定义的宏。如果宏不超过一个字符,可以直接使用,如$c;如果超过一个字符,需要用括号扩起来,如$(lib)。
环境变量:在makefile文件里面可以使用系统的环境变量,但是使用时,需要注意,必须用括号扩起来,如$(DMS_PUB).
makefile文件里面不可以用空格。目标所使用的编译命令要用一个tab空格缩进。切忌要使用TAB键进行缩进!
相关文章
- Makefile学习笔记1:Linux平台Makefile文件的编写基础篇(zz)
- Makefile学习笔记1:Linux平台Makefile文件的编写基础篇(zz)
- linux驱动编写(Kconfig文件和Makefile文件)
- linux下编写shell获取指定目录下的文件名
- Linux下多目录的Makefile编写
- Linux下通过.desktop 文件创建桌面程序图标及文件编写方式(Desktop Entry文件概述)
- VSCode下.json文件的编写之(1) linux/g++ (2).json中参数与预定义变量的意义解释
- Linux下编写Lua扩展so文件和调用方法实例
- Linux下编写makefile文件
- Linux下的Makefile文件编写