linux c++调用第三方库so 小记
1.undefined reference to `dlopen'
1.头文件添加:#include <dlfcn.h>
2.编译选项里加 -ldl 即: g++ main.cpp -o main -ldl 或者gcc
clion 下添加 TARGET_LINK_LIBRARIES(outdoorRobot dl)
//如果引用so是32位的,添加这个 (参考:https://www.zhihu.com/question/268066001)
set(CMAKE_C_FLAGS -m32) set(CMAKE_CXX_FLAGS -m32) add_executable(outdoorRobot main.cpp PClientSDK.h NetSDK.h resource.h) TARGET_LINK_LIBRARIES(outdoorRobot dl)
2.wrong ELF class: ELFCLASS32
解决:在makefile 中 在 g++ 后加上-m32 ,这样编译出的32位的脚本。
64位Ubuntu 可以运行32 位的脚本,32位无法运行64位脚本,以上。
命令:g++ -m32 main.cpp -o main -ldl
clion参考上面
3.usr/include/c++/9/iostream:38:10: fatal error: bits/c++config.h
1.源代码是C++ 编译为x86,报改错是因为电脑上没有安装交叉编译的g++组建
2.安装下组件
sudo apt-get install gcc-multilib g++-multilib
4.使用gdb调试 (32位)
g++ -g main.cpp -o main -ldl
调试程序:gdb main
start:从程序第一步开始执行
run:直接运行程序到结束或者断点处
5.Linux 查看.so中导出函数
方法一
nm -D **.so
但这样能看到所有的导出,乱七八糟的很多,筛选用:
nm **.so | grep XX
A 该符号的值在今后的链接中将不再改变;
B 该符号放在BSS段中,通常是那些未初始化的全局变量;
D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
T 该符号放在代码段中,通常是那些全局非静态函数;
U 该符号未定义过,需要自其他对象文件中链接进来;
W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。
方法二
objdump -tT **.so
6.undefined symbol
命令提前查出undefined symbol的项
ldd -r xx.so
若出现了上述问题,可以用c++filt来定位下到底是哪里出了问题
c++filt _ZN4cmpclsERSoRNS_11CMpegClientE
使用file 命令查看 so库的架构
段错误(核心已转储)
查看系统分配资源 ulimit -a
配置操作系统使其产生core文件 https://blog.csdn.net/youngys123/article/details/79804840
首先通过ulimit命 令查看一下系统是否配置支持了dump core的功能。通过ulimit -c或ulimit -a,可以查看core file大小的配置情况,如果为0,则表示系统关闭了dump core。可以通过ulimit -c unlimited来打开。若发生了段错误,但没有core dump,是由于系统禁止core文件的生成。
catchsegv
catchsegv命令专门用来捕获段错误,它通过动态加载器(ld-linux.so)的预加载机制(PRELOAD)
把一个事先写好的库(/lib/libSegFault.so)加载上,用于捕捉断错误的出错信息。
catchsegv ./main
ubuntu 32 /lib/i386-linux-gnu/libc.so.6 (__libc_start_main+0xf3)[0xb7517af3]??:?(_start)[0x8048911]
搜索库
locate "libc.so"
libc版本需要去目录看2.19
For 64 bit:
sudo ln -s /lib64/x86_64-linux-gnu/libc-2.13.so /lib64/libc.so.6
For 32 bit:
sudo ln -s /lib/i386-linux-gnu/libc-2.13.so /lib/libc.so.6
下载安装jdk https://www.cnblogs.com/xiaomingdaqiang/p/13617590.html
linux 绕过登录验证下载 jdk
wget https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.rpm
修改生效 source /etc/profile
本文来自博客园,作者:西瓜皮不甜,转载请注明原文链接:https://www.cnblogs.com/Jieth/p/15007040.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!