我是靠谱客的博主 鲤鱼冬天,最近开发中收集的这篇文章主要介绍Makefile变量及动态库静态库一、Makefile变量二、动态库和静态库,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、Makefile变量

1. Makefile的预定义变量

变量名含义
AR函数库打包程序,可创建静态库.a文档。默认是ar
AS汇编程序,默认是as
CCC编译程序,默认gcc
CXXC++编译程序,默认g++
CPPC程序的预处理器,默认是$(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:库文件路径(路径可根据自身需求指定); 
# 注意:封装动态库时候的函数对应头文件;动态库要存在;动态库的环境

最后

以上就是鲤鱼冬天为你收集整理的Makefile变量及动态库静态库一、Makefile变量二、动态库和静态库的全部内容,希望文章能够帮你解决Makefile变量及动态库静态库一、Makefile变量二、动态库和静态库所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部