Linux/Unix下makefile文件编写实例

时间:2021-11-02 12:41:14

最近做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为了简化文件结果,支持宏定义。如上面文件中到cclibobj等都是定义的宏。如果宏不超过一个字符,可以直接使用,如$c;如果超过一个字符,需要用括号扩起来,如$(lib)
环境变量:在makefile文件里面可以使用系统的环境变量,但是使用时,需要注意,必须用括号扩起来,如$(DMS_PUB).
makefile文件里面不可以用空格。目标所使用的编译命令要用一个tab空格缩进。切忌要使用TAB键进行缩进!