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 新版的动态库  要更新的动态库