linux学习中记录(静态库和动态库)

linux学习中记录(静态库和动态库)

gcc编译成可执行文件的过程,

 

 

一、静态库的打包方法:

gcc *.c  -c  把所有.c生成.o文件

gcc -I./inc 是指定头文件路径

gcc -o xiaApp 是生成可执行文件的名字

 

1.完整的使用

gcc *.c -c -I ./inc

打包成静态库

把所有的.o打包成libadd.a的静态库

ar rcs libadd.a  *.o

 

2.使用打包好的静态库,有两种使用方法:

第一种使用方法,

在main.c中使用libadd.a,-o指定编译成可执行文件的名字,-I指定用到的头文件路径

gcc main.c  ./lib/libadd.a -o xiaApp -I./inc

第二种使用方法,

-L指定静态库的路径,-l指定使用静态库的名字,-o指定可执行文件名字,-I 指定使用的静态库的头文件

gcc main.c -L ../lib/ -l add -o testApp -I ../inc

 

使用nm命令可以查看libadd.a静态库中有什么.o组成

linux学习中记录(静态库和动态库)

 

也可以使用nm查看可执行文件nm app

 

静态库的

linux学习中记录(静态库和动态库)

 

优点:

1.发布程序时候,不需要提供对应的库;

2.加载库的速度快。

缺点:

1.由于静态库打包到程序中了,导致库的体积大

2.库发生了改变,需要重新编译程序。

 

动态库(共享库)的制作

1.命名规则:

1)lib+名字+.so

2.制作步骤:

1)、生成与位置无关.o,gcc -fPIC意思是与位置无关

gcc -fPIC -c *.c -I../inc

linux学习中记录(静态库和动态库)

 

2)、将.o打包成共享库(动态库)

gcc -shared -o libmyadd.so *.o -I../inc

3)、用户调用.so的方法

第一种方式

gcc main.c ../lib/libmyadd.so -o soApp -I../inc

第二种方式

gcc main.c -I../inc -L ../lib -lmyadd -o mySoApp

 

使用ldd +可执行文件,可以看到可执行文件myApp所依赖的动态库

ldd myApp

 

执行./myApp

1)、把libmyadd.so 拷贝到系统的/lib目录下;

2)、echo $LD_LIBRARY_PATH 查看一下lib路径,

导入路径

 export LD_LIBRARY_PATH=./lib/

再查看可执行文件需要的动态库是否正常

ldd test/mySoApp 

./test/mySoApp