动态库和静态库那些事

ROS中catkin_make的OpenCV冲突的解决(踩坑小记,报错分析) libopencv_imgcodecs.so.3.2, needed by /opt/ros/melodic/lib/libcv_bridge.so, may conflict with libope 阅读详情


前言

经常使用到arm架构下静态库(.a)和动态库(.so),在使用过程中踩到不少坑,以此写下经鄙人验之谈,和需要了解和 学习的人一起互相学习。持续跟进追加,希望有一些我没有遇到的,欢迎补充。
(该行文内容使用在Makefile中,针对CMake部分后陆续更新)

静态库使用中的一些坑

  • 链接顺序问题
    • 第一种方式使用Xlinker解决,例如
      LIBS += foot.a LIBS += bar.a ${LD} 其他选项等略 -Xlinker "-(" $(LIBS) -Xlinker "-)"
    • 外一种方法为当静态库调用比较少时, 可以使用foot.a bar.a foot.a方式,即交换位置方式, 该方式不推荐,可以当做测试使用。
      LIBS += foot.a LIBS += bar.a LIBS += foot.a
      `

动态库使用中的坑和注意事项,规避等

  • c++调用c
    如果c中的接口(一般为h文件)没有添加如下
#ifndef __cplusplus
extern "C" {
#endif

void footfunc(const struct *IN, struct *OUT);
#ifndef __cplusplus
}
#endif

会导致链接错误,解决方式一种是接口中增加上面预编译代码段,如果对方没有提供源码,需要在调用方使用 如上代码包裹。

  • c文件名重命名cpp后缀
    有时候使用第三方的库和demo(c实现),但需要在demo中增加c++的接口库实现,比如libjson库,librtsp等, 将c文件重命名cpp文件,出现一系列的问题(c++语法严谨,可能会修改一些不严谨才能通过编译)。另外一个问题就是c中接口(通常为.h文件)增加如下的预编译段需要删除,只保留接口。
    项目: HI3519A venc RTSP推流
extern "C" {
#endif

void footfunc(const struct *IN, struct *OUT);
#ifndef __cplusplus
}
#endif
  • 一些低级错误导致
    比如有时候批量修改某些变量等,部分没有修改对,导致编译错误。

  • 源文件编译动态库增加-fPIC

@$(CPP) $(CPPOPTS) -fPIC $(DEFINES)

项目中的动态库静态库常用基本问题

  • 运行可执行文件报如下error cannot open shared object file: No such file or directory,解决方案是在运行的当前shell中增加动态库的路径(改路径一般为用户自定义的位置,非系统路径)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${需要链接的动态库绝对路径}
  • 当不清楚可执行文件调用了哪些库,可以使用ldd 可执行文件方式查看使用了哪些.so(动态库),该方式也可以看出没有链接到哪些动态库,如下可以看出来一些库是没有被链接,可通过系统搜索对应的动态库 find . -name librealsense2.so.2.49,然后使用1)中的方式装载。
ldd 你的可执行文件
linux-vdso.so.1 (0x0000007f8c558000)
	libMvCameraControl.so => /opt/MVS/lib/aarch64/libMvCameraControl.so (0x0000007f8c144000)
	librealsense2.so.2.49 => not found
	libMVbotdolly.so => not found
	libBaseAlgSDK.so => not found
	libmaxvision_algorithm_sdk_aarch64.so => not found
	libmax_thread.so => not found
	libmem_manager.so => not found
	librtspserver.so => not found
	libv4l_cap.so => not found
	libjetsonmedia.so => not found
	libopencv_core.so.4.5 => not found
	libopencv_imgcodecs.so.4.5 => not found
	libopencv_imgproc.so.4.5 => not found
	libopencv_videoio.so.4.5 => not found
	libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000007f8c0f5000)
	libz.so.1 => /lib/aarch64-linux-gnu/libz.so.1 (0x0000007f8c0c8000)
	libstdc++.so.6 => /usr/lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000007f8bf34000)
	libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000007f8be7b000)
	libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000007f8be57000)
	libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007f8bcfe000)
	/lib/ld-linux-aarch64.so.1 (0x0000007f8c52c000)
	libGCBase_gcc48_v3_0.so => /opt/MVS/lib/aarch64/libGCBase_gcc48_v3_0.so (0x0000007f8bcd5000)
	libGenApi_gcc48_v3_0.so => /opt/MVS/lib/aarch64/libGenApi_gcc48_v3_0.so (0x0000007f8b835000)
	libXmlParser_gcc48_v3_0.so => /opt/MVS/lib/aarch64/libXmlParser_gcc48_v3_0.so (0x0000007f8b6da000)
	libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000007f8b6c5000)
	libMathParser_gcc48_v3_0.so => /opt/MVS/lib/aarch64/libMathParser_gcc48_v3_0.so (0x0000007f8b6ab000)
	libLog_gcc48_v3_0.so => /opt/MVS/lib/aarch64/libLog_gcc48_v3_0.so (0x0000007f8b692000)
	libNodeMapData_gcc48_v3_0.so => /opt/MVS/lib/aarch64/libNodeMapData_gcc48_v3_0.so (0x0000007f8b668000)

  • 一些压缩包打包经过win系统,软连接会失效,压缩包尽量在linux下同下解压缩,不然只能一个个采用ln -s的方式做头疼的事情了。
  • 做文件系统等,如果静态库比较多,软连接也比较多, 尽量做成压缩包方式,脚本中尽量不要做ln -s的事情。
  • 关于使用动态库还是静态库, 如果是测试可执行,简单操作无需过多安装,使用静态库方式, 否则使用动态库。
静态库和动态库基于Windows和VScode 基于Windows和VScode关于C/C++的静态库和动态库创建和使用。 阅读详情

相关推荐

QT 静态库和动态库的使用方法

QT 静态库和动态库的使用方法 背景知识:程序在编译成可执行文件时,会有四步过程: 1预处理(头文件和宏定义) g++ -E 1.cpp -o 1.i 2编译 将c代码编译成汇编代码 g++ -S 1.cpp -o 1.s 3汇编 将汇编代码编译成二进制代码 g++ -c 1.cpp -o 1.o 4链接 链接我们用到的函数代码 还有地址(包含静态库而动态库是在运行时链接) gcc 1.c 静态库...

qq_32362161的博客 4019

GCC选项-Xlinker和-Wl区别

传递给链接器ld可以同时使用Xlinker和Wl两种命令。 总结了一下两者区别: Xlinker后面跟的参数第一个是空格,而Wl后面跟的第一个字符是","。 Xlinker一次只能传递一个参数,如果要传递两个参数:举个例子“-Map output.mp”需要写成"-Xlinker -Map -Xlinker output.mp",可以简化成"-Xlinker -Map=output.map"。而...

LU_ZHAO的博客 4263

MathLib:数学算法

MathLib 在calculus中有微积分为微积分实现方法,目前尚未进行实现在statistics中包含统计学相关的算法,如协方差,方差,求中位数,数值,分数值图计算 统计 ---- index : ---- Variance : ---- weigth_variance : ---- QuantilePlot : ---- Covariance : ---- Mean : ---- harmonic : ---- LeastSquare : ---- Media : ---- Matrix : ,实现矩阵的计算,例如相加,相减,矩阵的逆,矩阵转置 ---- rank :的实现(未完全实现) ---- StandardDeviation : ---- vector :的运算 ---- Permutations : ---- expetation : ---- sigmoid : - angule :角度 ---- gcd : ---- Factorial : ---- softmax : 增加链式调用,矩阵类以及矢量类 用法: 方差此方法求取数据的方差,返回的是方

Makefile 静态库链接

1:-Xlinker Linux静态库链接顺序问题解决: $(CXX) $(LINKFLAGS) $(OBJS) -Xlinker “-(” $(LIBS) -Xlinker “-)” -o $@ 通过将所有需要被链接的静态库放入 -Xlinker “-(” 与 -Xlinker “-)” 之间,可以是 g++ 链接过程中, 自动循环链接所有静态库,从而解决了原本的链接顺序问题。 2.config.mk # Generated by config_...

帅的没拼音 5012

树莓派国内镜像源一键配置指南

本文提供树莓派国内镜像源一键配置指南,解决默认国外源访问缓慢问题。通过自动检测系统版本并支持清华、阿里云、中科大等主流镜像站选择,大幅提升软件更新与安装速度。包含详细的手动配置方法和常见问题排查,帮助用户快速完成树莓派换源优化。

tequila的博客 1374

ANSYS Maxwell:创建即用型 3D 轴向磁通电机模型

Magnet Length” 是磁体的径向长度。“Magnet Thickness” 是磁体的轴向长度。为了对 AFM 进行更详细的分析,用户需要在 ANSYS Maxwell 中运行 3D FEA 分析。对于 2D 模型,它们类似于 MotorCAD 中的模型,后者对等效的直线电机进行建模。单击“确定”后,将创建一个 3D Maxwell 模型。“长度”是转子铁的轴向长度。然后需要定义定子的“磁芯”尺寸和材料。“长度”是定子铁芯的轴向长度。“转子”# 的极数必须与“定子”中定义的磁极相同。

jkh920184196的博客 1930

静态库和动态库的那点事

1静态库和动态库 (1)静态库 * 静态库是把程序运行时需要使用的函数编译在一个二进制文件中,扩展名为.lib。当程序link时把静态库中的二进制数据和程序其它数据放到一起。程序运行时不在需要lib和dll文件的支持。我们在链接的时候需要静态链接库,一旦链接成功,生成了可执行文件,那么,静态链接库就不再需要了。这样做的坏处是开发出来的程序占用磁盘空间较大。 * 静态库为.li

小庞(android/java/PHP/Web/linux/mysql) 936

MiniMax H3 + ComfyUI 工作流搭建指南:从整合包到视频生成

AI视频生成正成为内容创作的新基础设施,而ComfyUI作为可视化工作流引擎,将复杂的模型推理过程拆解为节点与连线,让本地视频生成变得可复用、可批量。理解这一原理后,用户无需编写代码,只需掌握模型加载、提示词控制、采样与解码的基本链路,即可搭建出稳定的视频生产管线。MiniMax H3作为前沿视频生成模型,在ComfyUI中通过权重文件和自定义节点落地,配合整合包可大幅降低环境配置门槛。从硬件评估、目录结构到节点连接与参数调优,本文系统性梳理了从零跑通一条视频生成工作流的完整路径,帮助用户在批量素材生成、风

weixin_29057065的博客 411

静态库和动态库链接那些事

事情源于: 两位同事进行连调时,A同事调用B同事的so, 运行了一会后直接出core了. 后来发现是B同事的so的结构体名和A同事的类名冲突了. 静态库 测试程序很简单如下: libA.h #ifndef __LIBA_H__ #define __LIBA_H__ ...

chenqunan3231的博客 157

ABAQUS应用15——Abaqus软件中边界条件与力学中自由度的关系

核心关系:Abaqus通过约束自由度实现边界条件,自由度类型由单元决定。正确设置步骤:确定模型类型(实体/梁/壳)。识别节点的自由度(平动或转动)。根据实际约束施加对应的自由度限制。验证:通过检查变形模式、反力分布等确认边界条件合理性。正确理解自由度与边界条件的关系,是确保有限元模型准确模拟实际物理行为的关键。

George的博客 1542

西门子精致面板TP1200 历史数据(历史数据、审计追踪) 移存到网络路径

TP1200 审计追踪

zhang080602的博客 5768

【Linux】静态库和动态库

介绍动静态库、制作动静态库以及使用动静态库,基于地址空间理解动态库加载和程序运行的过程!

YoungMLet的博客 4089

[UE5蓝图基础二]1.[1d混合空间] 走和跑的动画切换(shift切换)

再双击”run”进去 我们需要给他指定一个动画姿势,这里就需要给他我们前面做的”1d”混合空间,然后可以看到”1d” 上有个speed参数,代表的速度 从前面的逻辑来看需要通过控制速度来切换动画,那么必然不能写死速度,把速度提升为变量传递进来即可,所以就得到以下蓝图节点。混合空间的概念:混合空间就是可以将角色多个动画混合在一起 ,我们创建动画类就是创建个”Animation”文件夹 在文件夹内创建混合空间。我们目前要实现的是一个走和跑的功能 那么创建1d即可。到这一步混合空间已经做完 下一步做”动画蓝图”

qq_30584617的博客 3299

Linux —— 动态库和静态库

详细演示了动静态的库的制作和使用

M的博客 6002

LinuxCNC---在PC端显示开发板LinuxCNC界面

  今天在调试开发板时,执行开发板上的linuxcnc指令,总是出现如下报错 LINUXCNC - 2.9.0~pre0 application-specific initialization failed: couldn't connect to display "192.168.137.3:1" Error in startup script: invalid command name "image" while executing "image create photo -file $f/$i

中华田园巨龙 3469

QML实现ListView的拖动排序

现有一种需求,就是用鼠标拖动某项,动态去改变某一项在ListView中显示的顺序位置,经过研究及实践实战,实现方式的核心代码如下: import QtQuick 2.4 import QtQuick.Controls 1.3 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 Rectangle { width: 800 ...

草上爬的博客 7563

动态库和静态库

​静态库和动态库的介绍以及制作

caiji0169的博客 1751

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

静态库和动态库的区别

静态库和动态库的区别 1. 什么是库2. 静态库3. Linux下创建与使用静态库4. 动态库5. 总结 1. 什么是库         库是写好的,现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。         本质上来说,库是一种可执行代码的二进制形式,可以被操作系

qq_42688149的博客 6770

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 通过IP如何找到对应的MAC地址的
下一篇: ISP图像调优(支持工业相机)
帘下有白绿
博客等级 码龄12年 165粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值