[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)

目录

静态库(.a):

什么是静态库:

怎么生成静态库:

查看静态库中的目录列表:

使用(连接)静态库:

使用静态库的简单例子: 

动态库(.so):

什么是动态库:

库搜索路径:

怎么生成动态库:

使用(连接)动态库:

如果不想写动态库的路径,有以下方法:

使用动态库的简单例子:


静态库(.a):

什么是静态库:

静态库本质就是将库中的源文件直接编译成.o目标二进制文件,然后打包。程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。

怎么生成静态库:

ar -rc libxxx.a yyy.o zzz.o ...

xxx:库名

ar是gnu归档工具,rc表示(replace and create)

查看静态库中的目录列表:

ar -tv libxxx.a
xxx:库名

t:列出静态库中的文件
v:verbose 详细信息

使用(连接)静态库:

g++ main.cc -I路径 -L路径 -l库名

-I(i的大写)指定头文件路径

-L 指定库路径
-l (L的小写)指定库名

注意:库名是去掉lib和后缀(.a或者.so),例如:libxxx.a,则库名为xxx
测试目标文件生成后,静态库删掉,程序照样可以运行,原因是程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。

使用静态库的简单例子: 

实现加减乘除.cc(即.cpp)文件 add.cc sub.cc mul.cc div.cc

头文件 add.cc sub.cc mul.cc div.h

主函数入口 testmain.cc

Makefile

说明:库由于此处主要是使用静态库,并且代码太简单,所以此处就不详细标出,只是简单打印出

add.h        add.cc

[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)_第1张图片

sub.h        sub.cc

[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)_第2张图片

 mul.h        mul.cc

[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)_第3张图片

div.h        div.cc 

[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)_第4张图片

testmain.cc

[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)_第5张图片 

 Makefile

[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)_第6张图片

 操作前

[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)_第7张图片

步骤1:make;make output

[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)_第8张图片

步骤2:连接静态库

[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)_第9张图片

步骤3:验证可执行

[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)_第10张图片

动态库(.so):

什么是动态库:

  •  程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
  • 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

库搜索路径:

  • 从左到右搜索-L指定的目录。
  • 由环境变量指定的目录 (LIBRARY_PATH)
  • 由系统指定的目录
  1. /usr/lib
  2. /usr/local/lib

怎么生成动态库:

  • shared: 表示生成共享库格式
  • fPIC:产生位置无关码(position independent code)
  • 库名规则:libxxx.so

示例:

g++ -fPIC -c add.cc sub.cc

g++ -shared -o libmymath.so  add.o sub.o

使用(连接)动态库:

编译选项

I(i的大写)指定头文件路径(一般第三方库才用)
l:(L的小写)链接动态库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径

示例:

g++ main.cc  –L. -lhello

如果不想写动态库的路径,有以下方法:

1、安装到系统:拷贝.so文件到系统共享库路径下, 一般指/usr/lib
2、更改环境变量:更改 LD_LIBRARY_PATH

export LD_LIBRARY_PATH=.

3. 更改系统关于动态库的配置文件

  1. 配置/etc/ld.so.conf.d/:在/etc/ld.so.conf.d/创建一个xxx.conf文件,拷贝动态库的路径到xxx.conf文件
  2. ldconfig更新

4.与动态库建立软连接,用软链接查找动态库 

使用动态库的简单例子:

代码与静态库的一样 

Makefile略有改

dy-lib=libmymath.so
$(dy-lib):add.o sub.o mul.o div.o
	g++ -shared -o $@ $^
%.o:%.cc
	g++ -fPIC -c $<

.PHONY:output
output:
	mkdir -p mymath_lib/include
	mkdir -p mymath_lib/lib
	cp -f *.h mymath_lib/include
	cp -f *.so mymath_lib/lib
.PHONY:clean
clean:
	rm -rf *.o *.so a.out mymath_lib 

生成动态库:

[Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)_第11张图片

连接动态库:

 [Linux]动静态库(什么是动静态库,怎么生成动静态库,怎么使用(连接)动静态库)_第12张图片

 完结!

你可能感兴趣的:(linux,运维,服务器)