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

posted @ 2021-07-13 16:31  西瓜皮不甜  阅读(2067)  评论(0编辑  收藏  举报