1.静态库
静态库的概念
- 静态库就是一些.o目标文件的集合,以.a结尾。
- 静态库在程序链接的时候使用,链接器会将程序中使用到函数的代码从库文件中拷贝到可执行文件中。一旦链接完成,在执行程序的时候就不再需要链接静态库了。
- 由于每个使用静态库的应用程序都需要拷贝所用函数的代码,所以生成的可执行文件会比较大。
静态库的创建
ar rcs lib库文件名.a 目标文件1 目标文件2 ... 目标文件n
- r表示将.o的目标文件加入到静态库中;
- c表示创建静态库;
- s表示创建索引;
- 创建的库文件名字前面建议加上前缀lib,即lib库文件名.a 。
静态库的使用
1.执行命令
- gcc -o 可执行文件 调用者的目标文件 -Ldir -l库文件名
- gcc -o 可执行文件 -Idir 调用者的C源文件 -Ldir -l库文件名
2.使用实例
momo@anan:~/usr/dev/cc$ gcc -o ./obj/mysum.o -c ./func/mysum.c
momo@anan:~/usr/dev/cc$ ls -trl ./obj/mysum.o
-rw-rw-r-- 1 momo momo 1232 5月 2 23:19 ./obj/mysum.o
momo@anan:~/usr/dev/cc$ ar rcs ./lib/libmysum_jingtai.a ./obj/mysum.o
momo@anan:~/usr/dev/cc$ gcc -o ./bin/mysum_jingtai ./main/mymath.c -L./lib -lmysum_jingtai
momo@anan:~/usr/dev/cc$ ./bin/mysum_jingtai
请输入第一个数:
1
请输入第二个数:
2
1+2=3
2.共享库
共享库的概念
- 共享库即动态链接库,在Linux中以.so(shared object)为后缀,windows中以.dll为后缀。
- 共享库在程序的链接时候并不像静态库那样会拷贝使用函数的代码,而只是做些标记。在程序开始启动(实际上在加载程序时)运行的时候,加载所需的函数。
- 可执行程序在执行的时候仍然需要共享库的支持。
- 共享库链接出来的文件比静态库要小得多。
- C语言中所有标准的共享库放置在/usr/lib目录中。
共享库的创建
gcc -shared -fPIC -o lib库文件名.so 目标文件1 目标文件2 ... 目标文件n
- -shared 表示使用共享库
- -fpic或者-fPIC表明创建产生独立目标代码(位置无关代码),具体应用取决于平台
共享库的使用
1.执行命令
- gcc -o 可执行文件 调用者目标文件 -Ldir -l库文件名
- gcc -o 可执行文件 -Idir 调用者的C源文件 -Ldir -l库文件名
2.使用实例
momo@anan:~/usr/dev/cc$ gcc -o ./obj/mysum.o -c ./func/mysum.c
momo@anan:~/usr/dev/cc$ ls -trl ./obj/mysum.o
-rw-rw-r-- 1 momo momo 1232 5月 2 23:41 ./obj/mysum.o
momo@anan:~/usr/dev/cc$ gcc -shared -fpic -o ./lib/libmysum_dongtai.so ./obj/mysum.o
momo@anan:~/usr/dev/cc$ gcc -o ./bin/mysum_dongtai ./main/mymath.c -L./lib -lmysum_dongtai
momo@anan:~/usr/dev/cc$ ./bin/mysum_dongtai
./bin/mysum_dongtai: error while loading shared libraries: libmysum_dongtai.so: cannot open shared object file: No such file or directory
第一种解决方式:将我们用到的动态库文件复制到/usr/lib目录下;
momo@anan:~/usr/dev/cc$ sudo cp ./lib/libmysum_dongtai.so /usr/lib
[sudo] momo 的密码:
momo@anan:~/usr/dev/cc$ ls -trl /usr/lib/libmysum_dongtai.so
-rwxr-xr-x 1 root root 7648 5月 2 23:45 /usr/lib/libmysum_dongtai.so
momo@anan:~/usr/dev/cc$ ./bin/mysum_dongtai
请输入第一个数:
1
请输入第二个数:
2
1+2=3
第二种解决方式:创建临时环境变量,将我们的动态库所在目录存在该变量中
momo@anan:~/usr/dev/cc$ sudo cp ./lib/libmysum_dongtai.so /usr/lib
[sudo] momo 的密码:
momo@anan:~/usr/dev/cc$ ls -trl /usr/lib/libmysum_dongtai.so
-rwxr-xr-x 1 root root 7648 5月 2 23:45 /usr/lib/libmysum_dongtai.so
momo@anan:~/usr/dev/cc$ ./bin/mysum_dongtai
请输入第一个数:
1
请输入第二个数:
2
1+2=3
3.运行可执行文件的出错解决方案(库文件找不到)
- cp libmysum_dongtai.so /usr/lib (需root用户操作)
- export LD_LIBRARY_PATH=库文件的目录