C/C++静态库和动态库的制作及使用
- 1 静态库的制作
- 静态库简介
- 1.1 编写源码
- 1.2 生成目标文件
- 1.3 ar归档,打包成静态库
- 1.4 查看静态库
- 1.5 测试静态库
- 1.6 运行测试
- 2 动态库
- 2.1 编写 Makefile
- 2.2 编译链接动态库
1 静态库的制作
静态库简介
一般情况下,为了更好的支持开发,第三方库或者是语言库都必须提供静态库和动态库(eg:C C++等官方库),这是方便程序员根据需求功能进行可执行文件的生成;
动态链接使用动态库,而静态链接使用静态库。
一般来说,我们gcc编译默认是动态链接的而如果加上-static选项,那么生成的可执行文件将为静态生成;
1.1 编写源码
add.cpp
int add(int a,int b)
{
return a + b;
}
sub.cpp
int sub(int a,int b)
{
return a - b;
}
1.2 生成目标文件
g++ -c add.cpp -o add.o
g++ -c sub.cpp -o sub.o
1.3 ar归档,打包成静态库
ar -r -c libcal.a *.o
1.4 查看静态库
ar -t -v libcal.a
1.5 测试静态库
#include <iostream>
using namespace std;
#include "sub.h"
#include "add.h"
int main()
{
int iVal1 = 200;
int iVal2 = 100;
cout << sub(iVal1,iVal2) << endl;
cout << add(iVal1,iVal2) << endl;
return 0;
}
编译链接
g++ -o test test.cpp -I ./lib/ -L ./lib/ -l cal -static
- -I (大写i) 指定路径:告知g++除了默认路径之外,还要去寻找这个指定路径的头文件。
- -L + 指定路径 除默认库路径以外,需要寻找我们这个库的存放路径
- -l(小写L) 库名称:表示要具体链接的是哪一个库,即库的具体名称;(因为路径下库可能不止一个)
- -static 打包成静态库
编译链接过程中出现以上报错的解决办法
### 安装 glibc-static libstdc++
yum install glibc-static libstdc++-static
再次进行编译链接就不会报错
1.6 运行测试
删除动态库之后同样可以运行
2 动态库
2.1 编写 Makefile
代码的跟静态库的是一样的 可以直接进行动态库的制作
libcal.so:add.o sub.o
###################
## $@ -- 目标文件
## $^ -- 所有的依赖文件
## $< -- 第一个依赖文件
## g++ 带上-shared选项表示生成共享动态库格式
###################
@echo target=$@
g++ -shared -o $@ $^
add.o:add.cpp
@echo target=$@
g++ -fPIC -c $^
sub.o:sub.cpp
@echo target=$@
g++ -fPIC -c $^
clean:
rm *.o libcal.so
2.2 编译链接动态库
g++ -o test test.cpp -I ./lib/ -L ./lib/ -l cal
运行可执行程序
./test
./test: error while loading shared libraries: libcal.so: cannot open shared object file: No such file or directory
执行之后发现程序找不到动态库!!!
这属于运行问题,其实运行时系统也会去默认路径下找到我们所使用的动态库,但在默认路径下没有我们的库。
解决办法
修改环境变量LD_LIBRARY_PATH,将动态库所在路径.lib添加到该环境变量中,这样程序在运行时系统就能够找到动态库,从而运行成功
##
vim ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/mysqlTest/lib_test/lib
source ~/.bashrc
执行
./test
[mysql@chao_2 /home/mysql/mysqlTest/lib_test]$./test
100
300
运行结果正确!!!