linux编译静态、动态库

一、动态库和静态库的区别是什么
区别: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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值