一、动态库和静态库的区别是什么
区别:1、静态库的扩展名一般为“.a”或“.lib”;动态库的扩展名一般为“.so”或“.dll”。2、静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可独立运行;动态库在编译时不会放到连接的目标程序中,即可执行文件无法单独运行。
二、动态链接/静态链接优缺点
优点
动态链接优点:
1.不占可执行文件大小,在内存中只有一份实例,多个进程可共享一个动态库,节省内存。
2.便于升级,如果需要升级动态库模块时,可执行文件不需改变,直接升级动态库文件即可。
静态链接优点
1.可移植性好,如果把可执行文件放到其他电脑上,不用再需要动态库文件了。
2.运行的时候不用再把相应的库文件链接到内存,效率高。
缺点
动态库
1.移植性不好,如果其他电脑上运行可执行程序,没有动态库的话,会发生 not found ,导致程序无法正常运行。并且它是运行时加载,效率可能会慢些。
静态库
1.由于在链接的时候,被链接编辑器和目标文件一起链接成可执行程序,结果就是造成可执行程序过大,并且如果在内存中有多个相同的可执行程序,那么静态库文件在内存中也存在多个实例,浪费空间。(因为多个相同的静态库文件的代码段被加载到了内存)
2. 不便于升级,因为需要重新链接可执行程序。
完整示例:
g++ main.cpp libmedia_api.a libavformat.a libavcodec.a libavutil.a\
-lpthread -lv4l2 -lEGL -lGLESv2 -lX11 \
-lnvbuf_utils -lnvjpeg -lnvosd -ldrm \
-lnvinfer -lnvparsers -lnvonnxparser \
-L"/usr/lib/aarch64-linux-gnu" \
-L"/usr/lib/aarch64-linux-gnu/tegra" -o test
gcc -l xxx -L ./ -I xxx.h main.c -o a.out -static
-l(小写L) 指定库名字 -L 指定库路径 -I 指定头文件
三、修改CMakeLists.txt添加静态库
例如现有4个静态库.a和对应的头文件media_api.h,还有对应的main.cpp和make.sh,我们需要在代码中调用库中的接口。
make.sh
#!bin/sh
g++ main.cpp libmedia_api.a libavformat.a libavcodec.a libavutil.a\
-lpthread -lv4l2 -lEGL -lGLESv2 -lX11 \
-lnvbuf_utils -lnvjpeg -lnvosd -ldrm \
-lnvinfer -lnvparsers -lnvonnxparser \
-L"/usr/lib/aarch64-linux-gnu" \
-L"/usr/lib/aarch64-linux-gnu/tegra" -o test
echo "gen test"
1.在源代码中添加头文件
#include “media_api.h”
2.修改编译CMakelists.txt
参考:https://blog.csdn.net/afei__/article/details/81201039
https://editor.csdn.net/md?not_checkout=1&articleId=123687621
修改:
set(MEIDA_API_DIR "/home/nx/lib") //把4个.a和一个.h文件放到/home/nx/lib路径下
include_directories(
...
${MEIDA_API_DIR} //引入MEIDA_API_DIR路径中的头文件
)
link_directories(
...
/usr/lib/aarch64-linux-gnu
/usr/lib/aarch64-linux-gnu/tegra
${MEIDA_API_DIR} //设置链接库搜索目录
)
link_libraries(libmedia_api.a libavformat.a libavcodec.a libavutil.a)
target_link_libraries(pro v4l2 EGL GLESv2 X11 nvbuf_utils nvjpeg nvosd drm nvparsers nvonnxparser)