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