一、Makefile变量
1. Makefile的预定义变量
变量名 | 含义 |
---|---|
AR | 函数库打包程序,可创建静态库.a文档。默认是ar |
AS | 汇编程序,默认是as |
CC | C编译程序,默认gcc |
CXX | C++编译程序,默认g++ |
CPP | C程序的预处理器,默认是$(CC) -E |
RM | 删除命令,默认是rm -f |
ARFLAGS | 执行AR命令的命令行参数,默认rv |
ASFLAGS | 汇编器AS的命令行参数(明确指定.s或.S文件时) |
CFLAGS | 执行CC编译器的命令行参数(编译.c源文件的选项) |
CXXFLAGS | 执行g++编译器的命令行参数(编译.cpp源文件的选项) |
2. Makefile的自动化变量
变量名 | 含义 | 备注 |
---|---|---|
@ (文件名) | 代表其所在规则的目标的完整名称 | |
% (文件名) | 代表其所在规则的静态库文件的一个成员名 | |
< (文件名) | 代表其所在规则的依赖列表的第一个完整名称 | |
* (文件名) | 在模式规则和静态模式规则中,代表茎 | 茎时目标模式中”%”说代表的部分。当文件名存在目录时,茎也可包含目录 |
? (文件列表) | 待变所有时间戳比目标文件新的依赖文件列表,用空格分开 | |
^ (文件列表) | 代表其所在规则的依赖列表 | 同一文件不可重复 |
+ (文件列表) | 代表其所在规则的依赖列表 | 同一文件可重复,主要用在程序链接时,库的交叉引用场所 |
3. Makefile的自动化变量的变种
变量名 | 含义 | 备注 |
---|---|---|
@D | 代表目标文件的目录部分(去掉目录部分的最后一个斜杠) | 如果 $ @ 是dir/foo.o,那么$(@D)的值为dir;如果 $@存在斜杠,其值为当前目录(.);注意它与函数dir的区别 |
@F | 目标文件的完整文件名中除目录以外的部分(实际文件名) | 如果 $ @是dir/foo.o,那么 $ (@F)就是foo.o; $ (@F)等价于函数$(notdir $@) |
*D | 代表目标茎中的目录部分 | |
*F | 代表目标茎中的文件名部分 | |
%D | 当archive(member)形式静态库为目标时,表库文件成员member名中的目录部分 | 仅对archive(member)形式的规则目标有效 |
%F | 当archive(member)形式静态库为目标时,表库文件成员member名中的文件名部分 | 仅对archive(member)形式的规则目标有效 |
<D | 代表规则中第一个依赖文件的目录部分 | |
<F | 代表规则中第一个依赖文件的文件名部分 | |
^D | 代表所有依赖文件的目录部分 | 同一文件不可重复 |
^F | 代表所有依赖文件的文件名部分 | 同一文件不可重复 |
+D | 代表所有依赖文件的目录部分 | 同一文件可重复 |
+F | 代表所有依赖文件的文件名部分 | 同一文件可重复 |
?D | 代表被更新的依赖文件的目录部分 | |
?F | 代表被更新的依赖文件的文件名部分 |
4. Makefile的运行和使用
# 执行指定的Makefile Almake是makefile的名称
$ make -f ALmake
$ make --file Almake
$ make --makefile Almake
$ make TARGET #指定终极目标
#强制重建所有规则中的目标
$ make -B
$ make -always-make
#指定makefile的所在路径
$ make -C dir/
$ make --directory=dir/
# GNU-autotools工具(自动化makefile)
# GNU软件安装的三部曲
$ ./configure
$ make
$ make install
二、动态库和静态库
1. 静态库和动态库的了解
- 静态库:Linux以.a为后缀名的文件(win的lib文件)
静态库在gcc的链接阶段整合如可执行程序中。即使库被删除了,程序依然可以成功运行。但体积大.
程序装入时拷贝静态库装入程序的,所以体积较大。 - 动态库:Linux以.so为后缀的文件(win的dll文件)
动态库不专属于任何一个程序,任何程序都可以共用这个库,在程序运行时,才链接库。体积小。 - Linux的命名系统中动态库的规则
libname.so.x.y.z
lib:固定代表库 name:库名 so:固定后缀 x:主版本号 y:次版本号 z:发行版本号
主版本在版本升级时是不兼容(主版本号区别)
次版本更新软件,保留原有的程序,添加功能(版本号向下兼容)
发行版本性能更改,程序优化;(相互兼容)
2. 静态库的创建和使用(ar命令)
# ar的常用参数
$ ar -ctr libtest.a *.o #将当前目录下的所有.o文件都打包成静态库libtest.a
#ar 的参数
# -r 将文件插入库文件中,如果已存在就替换;
# -t 查看所有打包的.o文件
# -c 表示创建,create
$ gcc main.c libtest.a -o main #使用静态库
3. 动态库的创建和使用
$ gcc -fPIC -shared *.c -o libtest.so #创建动态库
# -fPIC 表示生成独立代码 PIC告诉编译器产生与位置无关代码,即内存不固定。
# -shared 表示生成共享的动态库
$ gcc main.c ./libtest.so -o main -I ./inc #链接动态库生成执行文件main,但main执行的时候动态库必须存在。
#动态库默认实在系统lib中找,可以将生成的动态库考培带系统lib中;也可添加$LD_LIBRARY_PATH 的环境变量到本目录下也可。
# 添加环境变量export LD_LIBRARY_PATH=/home/gec/Linux/ku:$LD_LIBRARY_PATH
# /home/gec/lib:库文件路径(路径可根据自身需求指定);
# 注意:封装动态库时候的函数对应头文件;动态库要存在;动态库的环境