为什么要使用动态库?
在实际工作工作,常常需要给予其他人自己的库文件,但是,我们只想让其他人使用我们的库文件,而不想让其他人知道我们具体代码,所以就引入了动态库的概念,使用动态库可以让使用者正常使用我们的库,但是却不知道我们库里面的具体代码细节。
实战举例
首先在/root目录下创建一个test文件
创建两个文件:一个是app,一个是tools。
在app里面创建一个demo01.cpp文件,代码如下:
#include "/root/test/tools/public.h"
using namespace std;
int main(){
func();
AA a;
a.show();
}
在tools里面创建一个public.cpp和public.h文件。
public.h文件如下:
#include <iostream>
void func();
class AA
{
public:
void show();
};
public.cpp文件如下:
#include "public.h"
using namespace std;
void func(){
cout <<"调用了func()函数\n"<<endl;
}
void AA::show(){
cout <<"我是一只傻傻鸟\n"<<endl;
}
编译
如果是在VS studio里面的话,直接点击编译即可,但是我们是在Vs code里面写代码,然后在Linux下面编译,用命令进行编译,这的确有点麻烦哦。
第一步:创建动态库
首先进入存放public.cpp的路径,将public.cpp制作成动态库,.h文件不需要制作成动态库。
g++ -fPIC -shared -o libpublic.so public.cpp
-fPIC -shared表示制作动态库
libpublic.so表示动态库的文件名,命名规则是lib+源文件名,后缀是.so
public.cpp表示源文件名
第二步:编译主函数
进入存放demo01.cpp的目录
输入命令:
g++ -o demo01 demo01.cpp -L/root/test/tools -lpublic
demo01:表示可执行文件名字
demo01.cpp:表示第一个库文件名字
-L/root/test/tools -lpublic:表示动态库文件,其中-L表示指定目录,-l表示动态库文件的名字,这里不需要加lib了,直接源文件名即可,后缀也不需要了。
第三步:设置环境变量
在编译完第二步的命令后,居然报了个错误,说是没指定位置。
原来使用动态库必须指定环境变量,这个问题不大,以后都是一样的套路。
第一步:输入命令
echo $LD_LIBRARY_PATH
这里无论显示不显示都没问题。
第二步:输入命令
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/test/tools
/root/test/tools:表示动态库文件的存放地址。其实也就是public.cpp的地址,记住,除了主函数文件放在app里面外,其余的库文件都放在tools里面
第三步:再次编译
g++ -o demo01 demo01.cpp -L/root/test/tools -lpublic
./demo01