[C++学习]静态库和动态库的生成调用

文件目录:
(base) ubuntu@ubuntu:~/muke01/aa01$ tree -l
.
├── app
│ ├── a.out
│ ├── demo
│ └── demo.cpp
└── tool
├── libpublic.a
├── public.cpp
└── public.h

静态库的方式:

生成静态库:
cd tool
只编译不链接:
g++ -c -o libpublic.a public.cpp
cd …/app
两种方式,推荐第1种, -L是静态链接库的目录, -l 是静态链接库的名称 不用加libxxx.a,会自己加上。 第二种是写死的方式自己调用
g++ demo.cpp -L …/tool -l public
g++ demo.cpp …/tool/libpublic.a

直接调用和使用:
897 g++ demo.cpp …/tool/public.cpp
898 ./a.out

动态链接

g++ -fPIC -shared -o libpublic.so public.cpp

(base) ubuntu@ubuntu:~/muke01/aa01/app$ g++ -o demo demo.cpp …/tool/libpublic.so
(base) ubuntu@ubuntu:~/muke01/aa01/app$ ./demo
hello world
A::show call
func inside call

推荐做法:
g++ -o demo demo.cpp -L …/tool -l public

报错:
(base) ubuntu@ubuntu:~/muke01/aa01/app$ ./demo
./demo: error while loading shared libraries: libpublic.so: cannot open shared object file: No such file or directory

解决:
运行可执行程序的时候,需要提前设置LD_LIBRARY_PATH环境变量。

系统自己的:
(base) ubuntu@ubuntu:~/muke01/aa01/app$ echo $LD_LIBRARY_PATH
/home/ubuntu/Downloads/TensorRT-8.6.1.6/lib::/usr/local/cuda-11.8/lib64:/home/ubuntu/Downloads/TensorRT-8.6.1.6:/usr/local/cuda/lib64

不要动他,加上我们自己的,这个时候i要写绝对路径了。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ubuntu/muke01/aa01/tool

(base) ubuntu@ubuntu:~/muke01/aa01/tool$ export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ubuntu/muke01/aa01/tool
(base) ubuntu@ubuntu:~/muke01/aa01/tool$ cd ..
(base) ubuntu@ubuntu:~/muke01/aa01$ ls
app  tool
(base) ubuntu@ubuntu:~/muke01/aa01$ cd app/
(base) ubuntu@ubuntu:~/muke01/aa01/app$ ls
demo  demo.cpp
(base) ubuntu@ubuntu:~/muke01/aa01/app$ g++ -o demo demo.cpp  -L ../tool -l public
(base) ubuntu@ubuntu:~/muke01/aa01/app$ ./demo 
hello world
A::show call 
func inside call

一、静态库
1)制作静态库
g++ -c -o lib库名.a 源代码文件清单
2)使用静态库
不规范的做法:
g++ 选项 源代码文件名清单 静态库文件名
规范的做法:
g++ 选项 源代码文件名清单 -l库名 -L库文件所在的目录名
3)静态库的概念
程序在编译时会把库文件的二进制代码链接到目标程序中,这种方式称为静态链接。
如果多个程序中用到了同一静态库中的函数或类,就会存在多份拷贝。
4)静态库的特点
• 静态库的链接是在编译时期完成的,执行的时候代码加载速度快。
• 目标程序的可执行文件比较大,浪费空间。
• 程序的更新和发布不方便,如果某一个静态库更新了,所有使用它的程序都需要重新编译。
二、动态库
1)制作动态库
g++ -fPIC -shared -o lib库名.so 源代码文件清单
2)使用动态库
不规范的做法:
g++ 选项 源代码文件名清单 动态库文件名
规范的做法:
g++ 选项 源代码文件名清单 -l库名 -L库文件所在的目录名
运行可执行程序的时候,需要提前设置LD_LIBRARY_PATH环境变量。
3)动态库的概念
程序在编译时不会把库文件的二进制代码链接到目标程序中,而是在运行时候才被载入。
如果多个进程中用到了同一动态库中的函数或类,那么在内存中只有一份,避免了空间浪费问题。
4)动态库的特点
• 程序在运行的过程中,需要用到动态库的时候才把动态库的二进制代码载入内存。
• 可以实现进程之间的代码共享,因此动态库也称为共享库。
• 程序升级比较简单,不需要重新编译程序,只需要更新动态库就行了。
三、优先使用动态库
如果动态库和静态库同时存在,编译器将优先使用动态库。

makefile的案例

INCLUDEDIR=-I/home/wucz/tools -I/home/wucz/api
LIBDIR=-L/home/wucz/tools -L/home/wucz/api

all:demo01 demo02 demo03

demo01:demo01.cpp
        g++ -o demo01 demo01.cpp $(INCLUDEDIR) $(LIBDIR) -lpublic -lmyapi
        cp demo01 /tmp/.

demo02:demo02.cpp
        g++ -o demo02 demo02.cpp $(INCLUDEDIR) $(LIBDIR) -lpublic -lmyapi

demo03:demo03.cpp
        g++ -o demo03 demo03.cpp $(INCLUDEDIR) $(LIBDIR) -lpublic -lmyapi

clean:
        rm -f demo01 demo02 demo03

猜你喜欢

转载自blog.csdn.net/weixin_40293999/article/details/132691475