最近做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的规则
在讲述这个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键进行缩进!