0. 提前准备
01.准备目录 /home/vv/cpp/lib ,放我们的自己的主程序 main.cpp
#include "print.h"
int main()
{
printa();
printb();
return 0;
}
02.准备目录/home/vv/cpp/lib 为我们制作库的目录 并且放我们库的源码
//print.h 头文件
#include <iostream>
extern void printa();
extern void printb();
//printa.cpp
#include "print.h"
void printa()
{
std::cout << "static print a" << std::endl; // 静态库 根据实际制作选择注释打印
std::cout << "shared print a" << std::endl; // 动态库
}
//printb.cpp
#include "print.h"
void printb()
{
std::cout << "static print b" << std::endl; // 静态库
std::cout << "shared print b" << std::endl; // 动态库
}
1.静态库
g++ -c printa.cpp printb.cpp # 生成目标二进制文件 也可以用-o单个生成
ar crsv libprint.a printa.o printb.o #打包成静态库
#编译连接静态库 方式一
g++ main.cpp -o main -lprint -L./testlib -I./testlib #-L 当前静态库所在目录 -I 头文件所在目录
#方式二 系统级目录 将 头文件放在sudo cp testlib/print.h /usr/include/ 静态库放在 sudo cp libprint.a /usr/lib
g++ main.cpp -lprint #直接编译 会直接去找头文件和静态库
#方式三 用户级目录 sudo mv /usr/include/print.h /usr/local/include/ sudo mv /usr/lib/libprint.a /usr/local/lib/
g++ main.cpp -lprint #同上
静态库已经被打包给了程序,所以程序的运行已经和原来的库没有任何关系了
2.动态库
2.1 制作和链接
制作和链接和静态库差别不大,只是加了一些参数
g++ -fpic -c printa.cpp printb.cpp #生成位置无关的目标文件 -fpic
g++ -shared printa.o printb.o -o libprint.so #生成共享库文件 -shared
#链接和上面静态库一样 也支持三种 只给出命令 不再进行解释
#方式一
g++ main.cpp -I./testlib -L./testlib -lprint
#方式二 和方式三 一样
g++ main.cpp -lprint
#注 当有静态库和动态库的时候 一般默认的动态库 也可以强制链接静态库
g++ main.cpp -I./testlib -L./testlib -lprint -static #加上-static即可
2.2 动态库运行
动态库运行是需要根据路径 再次去加载动态库 直接运行 会显示报错
error while loading shared libraries: libprint.so: cannot open shared object file: No such file or directory
#方式一 设置环境变量的方法(LD_LIBRARY_PATH)可以在当前会话中有效,且仅对当前用户有效。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./testlib #这里可以使用相对路径
#方式二 编辑用户配置文件(~/.bashrc)仅对特定用户有效
echo export LD_LIBRARY_PATH=/home/vv/cpp/lib/testlib >> ~/.bashrc #使用绝对路径
source ~/.bashrc #记得重新加载bashrc
#方式三 编辑系统配置文件(/etc/profile)对所有用户有效
sudo sh -c 'echo export LD_LIBRARY_PATH=/home/vv/cpp/lib/testlib >> /etc/profile'
source /etc/profile
#方式四 编辑/etc/ld.so.conf文件:可以编辑/etc/ld.so.conf文件,在文件中加入共享库所在目录的路径。随后运行sudo ldconfig -v命令,这将更新库目录的缓存
#自行搜索吧
2.3更新动态库
ln -s 新版的动态库 要更新的动态库