四、SLAM学习笔记—— Ubuntu18.04交叉编译OpenCV4.5.5至ARM64位平台firefly-RK3566
概述: 交叉編譯大概的意思是指: 在PC(x86_x64)的機器上編譯其他平臺如ARM平臺的代碼,這個過程叫做交叉編譯。對于交叉編譯,我們首先確定目標平臺的架構,RK3566的架構是ARMv8,64位的執行狀態。aarch64的介紹可以參考:[https://blog.csdn.net/tanli20090506/article/details/71435777]官方的Linux的SDK中,提供的編譯器為:
整個交叉編譯工程從大的步驟上講其實很簡單,就是細節的坑有一些,總體步驟:1)下載OpenCV的代碼 2) 用CMake-GUI工具配置編譯配置 3) 利用gcc-aach64編譯代碼得到動態庫so 4) 編譯程序在RK3566開發板運行。
一、下載OpenCV4.5.5代碼和OpenCV Contributed代碼
OpenCV: 官網下載
OpenCV Contribute :?https://github.com/opencv/opencv_contrib/archive/4.5.5.zip
1.2 啟動cmke-gui
1.3 配置源代碼目錄和生成目錄Build
點擊Config:
配置opencv_contribute目錄:
1.4
運行后可以看到代碼正在編譯:
二、CMake-GUI的配置?
三、OpenCV代碼的編譯
編譯OpenCV4.5.5出現的錯誤:
../../lib/libopencv_world.so.4.5.3: undefined reference to `png_do_expand_palette_rgb8_neon' ../../lib/libopencv_world.so.4.5.3: undefined reference to `png_init_filter_functions_neon' ../../lib/libopencv_world.so.4.5.3: undefined reference to `png_do_expand_palette_rgba8_neon' ../../lib/libopencv_world.so.4.5.3: undefined reference to `png_riffle_palette_neon' collect2: error: ld returned 1 exit status apps/model-diagnostics/CMakeFiles/opencv_model_diagnostics.dir/build.make:95: recipe for target 'bin/opencv_model_diagnostics' failed make[2]: *** [bin/opencv_model_diagnostics] Error 1 CMakeFiles/Makefile2:3183: recipe for target 'apps/model-diagnostics/CMakeFiles/opencv_model_diagnostics.dir/all' failed make[1]: *** [apps/model-diagnostics/CMakeFiles/opencv_model_diagnostics.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs....對應的解決方案:打開opencv源碼目錄,編輯文件?vim 3rdparty/libpng/pngpriv.h
第130行注釋掉, 修改為131行
該解決方案親測可行,參考博文:https://blog.csdn.net/u010571709/article/details/122103591
四、編譯OpenCV的DEMO在板子上運行
創建一個main.c的OpenCV的DEMO程序,實現的功能是將普通的圖像轉換為黑白二值化的圖像。
#include <iostream> #include "opencv2/opencv.hpp" #include "opencv2/calib3d/calib3d.hpp" using namespace std; using namespace cv; int main() {Mat imag, result;imag = imread("mv3.jpg",16);result = imag.clone();threshold(imag, result, 100, 250, THRESH_OTSU);imwrite("huidu.jpg",result);return 0; }直接編寫一個簡單的命令調用aarch64-g++編譯上邊的程序:
/home/wzw/rk3566/rk_cross_compile_tool/bin/aarch64-linux-gnu-g++ -g -std=c++11 test.cpp \-o test_opencv.out \-I/home/wzw/rk3566/rk3566_opencv/include \-L/home/wzw/rk3566/rk3566_opencv/lib \-lopencv_core \-lopencv_imgcodecs \-lopencv_imgproc-I : 指定包含頭文件的位置
-L: 指定庫文件所在的位置
-l : 指定庫的名稱。雖然完整的名稱是libopencv_core.so 但是我們不寫后綴名,也寫前邊的lib。
五、編譯程序在RK3566上的運行
5.1?運行.out 提示: no such file or directory
? ? ? ? 本次交叉編譯編譯出.out文件,但是運行的時候提示no such file or directory,最終經過排查懷疑是編譯的程序無效(編譯器的架構選錯), 后續選RK3566 SDK提供的交叉編譯工具編譯代碼沒出現這該情況。
5.2?error while loading shared libraries: xxx.so.x
? ? ? ? 當我解決了5.1的問題后,隨之而來的是無法正確加載so庫。這是因為我以為linux和windows相同,都會默認加載可執行文件同目錄的so文件。實際上linux默認情況下并不會先在當前目錄下搜尋so庫,從而導致error while loading shared libraries。
? ? ? ? 可以通過ldd命令查看程序依賴庫情況,樣例如下所示,由于RK3566開發板不好截圖,用其他博客的圖[linux加載動態庫問題_黃粱一夢-CSDN博客_linux加載動態庫]代替:
5.3讓Linux在當前目錄下調用so庫文件
? ? ? ? Linux系統在當前目錄下調用so文件:默認情況下Linux系統不在會當前系統下尋找程序需要加載的Library文件,這點和windows并不相同,windows會優先從程序的當前目錄下搜尋dll并嘗試加載。這個有時候并不方便調試代碼。一個簡單的方式是:Ctrl + Alt + T打開命令行,輸入:
# 臨時修改,log out之后就失效 export LD_LIBRARY_PATH=./? ? ? ? 如果需要任何時候都優先在當前目錄搜尋Library,那么按下面的方法:
# 讓當前帳號以后都優先加載當前目錄的動態庫 修改~/.bash_profile在文件末尾加上兩行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH # 讓所有帳號從此都優先加載當前目錄的動態庫 修改/etc/profile在文件末尾加上兩行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH5.4?鏈接庫的時候,提示load shared libraries error,xxx file too short
? ? ? ? 經過前面的步驟,終于可以看到系統在嘗試記載本地的so庫,但是加載庫的時候提示庫太短了。原因:程序鏈接的動態庫中有軟連接,但是軟連接沒有(l)標識,被識別成了實際的動態庫文件,軟連接文件又太小,所以就成了too short,解決辦法,重新建立軟連接。
rm libopencv_core.so libopencv_core.so.405 ln -s libopencv_core.so.4.5.5 libopencv_core.so.405 ln -s libopencv_core.so.405 libopencv_core.so? ? ? ? 經過上述的各種問題的處理,終于交叉編譯的程序終于在RK3566的板子上正常運行。
六、交叉編譯譯程序在RK3566上的運行
? ? ? ? 通過Ubuntu18.04交叉編譯的OpenCV庫除了opencv_highgui這個庫之外,其他庫都基本都是正常的。PC的Ubuntu18.04編譯的OpenCV庫會出現下面的問題:
terminate called after throwing an instance of 'cv::Exception'what(): OpenCV(4.5.5-dev) /home/wzw/opencv4.5.5/modules/highgui/src/window.cpp:1251: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-devand pkg-config, then re-run cmake or configure script in function 'cvNamedWindow'? ? ? ? 這是因為opencv_highgui這個庫依賴GTK圖形庫。而虛擬機的libgtk是x64,RK3566是arm的libgtk。對于這個問題,可以在RK3566通過源碼編譯opencv_highgui.so這個庫,然后替換交叉編譯的opencv_highgui.so。
? ? ? ?我測試了一下RK3566通過源碼的方式安裝OpenCV4.5.5 + OpenCV_Contrib4.5.5 大約需要3小時。如果僅選擇opencv_core和opencv_highgui等基本庫,應該很快就能編譯完。
總結
以上是生活随笔為你收集整理的四、SLAM学习笔记—— Ubuntu18.04交叉编译OpenCV4.5.5至ARM64位平台firefly-RK3566的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最近看的几部不错的电影
- 下一篇: 电子电路基础 (1)——电子电路常识