Makefile变量及动态库静态库

一、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:库文件路径(路径可根据自身需求指定); 
# 注意:封装动态库时候的函数对应头文件;动态库要存在;动态库的环境

猜你喜欢

转载自blog.csdn.net/weixin_44763594/article/details/125954826
今日推荐