1. 程式人生 > >交叉編譯opencv2.31與移植至arm9

交叉編譯opencv2.31與移植至arm9

  專案需求,交叉編譯opencv2.3.1,並移植到mini2440中,現將本人的心得與過程中的錯誤分享如下,希望對大家有所幫助。注意:在opencv2.0以上的版本編譯都要藉助於cmake工具生成Makefile,2.0一下版本一般都是

使用./configure生成Makefile。

  一、開發環境

  上位機:Fedora9.0

  交叉編譯器:arm-linux-gcc4.4.3(友善之臂提供)

  cmake-2.8.7-Linux-i386.sh

  二、安裝交叉編譯工具鏈

  本人安裝目錄為:/opt/toolchain/4.4.3

   新增環境變數:在PATH環境變數中新增交叉編譯工具鏈的bin路徑:/opt/toolchain/4.4.3/bin  (大家根據自己的安裝路徑而定)

 三、安裝cmake

  在Linux下也有cmake的GUI版本,我使用的版本如上文提到的,大家可以在網上搜索下,有很多的下載連結。

  安裝步驟:在linux系統中修改cmake-2.8.7-Linux-i386.sh的執行許可權

[[email protected] opt]# chmod +x cmake-2.8.7-Linux-i386.sh      (修改為可執行許可權)

執行cmake-2.8.7-Linux-i386.sh:

[[email protected] opt]# ./cmake-2.8.7-Linux-i386.sh
回車後在就會在當前目錄下解壓出cmake-2.8.7-Linux-i386資料夾,進入資料夾:

[[email protected] opt]# cd cmake-2.8.7-Linux-i386
可以發現目錄下bin、include等目錄,進入bin目錄:

[[email protected] cmake-2.8.7-Linux-i386]# cd bin

可以發現bin目錄下有cmake-gui、cmake、ccmake等可執行檔案

在Linux圖形介面下,執行cmake-gui檔案:

[[email protected] bin]# ./cmake-gui

出現如下介面:

選擇原始碼目錄:/opt/OpenCV-2.31
  選擇Build目錄:/opt/opencv2.3.1_forArm,大家根據自己的喜好設定編譯目錄吧。

  點選Configure,保持generator為Unix Makefiles,選擇Specify options for cross-compiling,點選Next
Operating System填寫arm-inux
C Compilers填寫/opt/toolchain/4.4.3/bin/arm-linux-gcc
C++ Compilers填寫/opt/toolchain/4.4.3/bin/bin/arm-linux-g++
程式庫的Target Root填寫/opt/toolchain/4.4.3/bin/,然後點選Finish,如下圖:

  上面標註的表示opencv將要安裝的目錄,預設為/usr/local,為了便於管理,大家可以安裝在自己設定的目錄下,可以修改,同時,網上資料說:另外,我沒有安裝tiff影象的支援,因此去掉WITH_TIFF(出自:http://blog.csdn.net/eagelangel/article/details/7232364)。但是我沒有這麼做。在此點選Configure,然後點選Gennerate就會生成Makefile。

  進入/opt/opencv2.3.1_forArm目錄,執行make命令,就會編譯opencv,編譯過程中遇到如下錯誤:

In file included from /opt/OpenCV-2.3.1/modules/flann/src/precomp.hpp:9,
                 from /opt/opencv2.3.1_forArm/modules/flann/opencv_flann_pch_dephelp.cxx:1:
/opt/OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h: In function 'T cvflann::abs(T) [with T = long double]':
/opt/OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h:63: error: 'fabsl' was not declared in this scope
make[2]: *** [modules/flann/CMakeFiles/opencv_flann_pch_dephelp.dir/opencv_flann_pch_dephelp.obj] Error 1
make[1]: *** [modules/flann/CMakeFiles/opencv_flann_pch_dephelp.dir/all] Error 2
make: *** [all] Error 2

  解決方法:修改OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h檔案第63行的原始碼:將absl()修改為abs()

  如果編譯過程遇到如下錯誤:

Linking CXX executable ../../bin/opencv_test_calib3d
../../lib/libopencv_core.so: undefined reference to `pthread_key_create'
../../lib/libopencv_core.so: undefined reference to `pthread_getspecific'
../../lib/libopencv_ts.so: undefined reference to `pthread_key_delete'
../../lib/libopencv_core.so: undefined reference to `pthread_once'
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_core.so: undefined reference to `pthread_setspecific'
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_test_calib3d] Error 1
make[1]: *** [modules/calib3d/CMakeFiles/opencv_test_calib3d.dir/all] Error 2
make: *** [all] Error 2

  解決方案:修改/opt/opencv2.3.1目錄下的CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原來為空,加上-lpthread -lrt,如下圖:

  注意:每次錯誤產生,經修改後,只要再次執行make命令就接著編譯,編譯成功後,執行make intall命令就會安裝opencv。

  由於本人的安裝目錄為:/opt/opencv2.3.1_arm,大家可以看到生成了bin、lib、include等目錄,如下:


  在lib目下可以發現很多動態庫檔案,如下:

  至此,opencv交叉編譯成功了。時間倉促,文中難免疏漏。

本人寫此文參考了的博文,在此表示感謝,博文出處:http://blog.csdn.net/eagelangel/article/details/7232364


相關推薦

交叉編譯opencv2.31移植arm9

  專案需求,交叉編譯opencv2.3.1,並移植到mini2440中,現將本人的心得與過程中的錯誤分享如下,希望對大家有所幫助。注意:在opencv2.0以上的版本編譯都要藉助於cmake工具生成Makefile,2.0一下版本一般都是 使用./configure生成M

openWRT Ubuntu環境搭建及交叉編譯工具製作使用

Openwrt本身不支援直接編譯C語言的,不支援GCC,因此,我們在Ubuntu下寫好的程式碼,通過gcc編譯後的可執行檔案是不能直接在openWRT上執行的。 因此,我們需要製作基於openWRT的交叉編譯工具 toolchain。 1

alsa lib和utils交叉編譯移植

一、PC端使用alsa 1)PC上使用alsa時,正常的安裝alsa-lib和alsa-util即可,alsa-lib提供alsa音訊程式執行所需要的庫,alsa-util主要生成可執行程式,在程式執行時,在link裡新增-lasound即可使用 2)PC端使用alsa程式設計,具體過程可以參考網上的連結,

MQTT原始碼交叉編譯移植

基於MQTT原始碼的嵌入式LINUX移植,網上可參看資料幾乎沒有,估計是用的不多,沒什麼人弄,又或者 太簡單,沒人寫參考。這裡記錄下編譯與移植過程。大致有三部分,交叉編譯openssl、交叉編譯MQTT、安裝MQTT伺服器。 1 交叉編譯OPENSSL 因為MQTT

5.MQTT再學習 -- 交叉編譯移植

先說明一下,遇到的問題。我之前在 Ubuntu12.04 gcc 下可以搭建 mqtt 伺服器生成的 libmosquitto.so.1。現在我要在 DM368 的交叉編譯器 arm-none-linux-gnueabi-gcc  連結共享庫 libmosquitto.so.

ALSA交叉編譯移植

一、PC端使用alsa1)PC上使用alsa時,正常的安裝alsa-lib和alsa-util即可,alsa-lib提供alsa音訊程式執行所需要的庫,alsa-util主要生成可執行程式,在程式執行時,在link裡新增-lasound即可使用2)PC端使用alsa程式設

QT5.7.0交叉編譯移植遇到的問題以及解決辦法

花一個周的時間,終於總結了一篇這樣的文章。都是坑呀,在這裡放出來,給那些找不到解決辦法的人一點提示。如果有不足的地方,請指正。謝謝。前提:開發板是大升電氣的SBC-IMX6UL。QT5.7.0 交叉編譯遇見的問題及解決方法1.    問題1:在configure的過程中遇到的

Qt Creator的安裝Qt交叉編譯的配置

wid 設置 sem arm pad name 生成 art file Qt Creator 的安裝 到Qt官網下載Qt Creator https://www.qt.io/download-open-source/ 其它舊版本點擊Achieve連接下載 或登錄h

mips交叉編譯移植python

1、準備 https://www.python.org/ 官網上下載最新的Python-2.7.15.tgz 由於需要zlib和sqlite3因此分別去官網下載 sqlite-autoconf-3250300.tar.gz zlib-1.2.1.2.tar.gz 2、編

日誌工具zlog交叉編譯imx下位機執行

2018-11-22  白微 zlog的官網http://hardysimpson.github.io/zlog/ zlgo github原始碼下載網https://github.com/HardySimpson/zlog/releases 有網友提供瞭如下版本,方便其他平臺上安裝編譯,非常感

qt5.2交叉編譯移植到arm(s5pv210)

1、下載qt-everywhere-opensource-src-5.2.0.tar.xz原始碼,連結:http://download.qt.io/archive/qt/5.2/5.2.0/single/ 2、解壓tar xJf tar xJf qt-everywhere-openso

hi3531下交叉編譯移植 FFMPEG X264 XVID

1. 主機環境:   Thinkpad x230 CTO      win7 64位      +   VMware 11.1.2  + ubun

Libusb交叉編譯移植

  Libusb交叉編譯和移植      某專案核心需要支援USB的相關操作,所以考慮移植Libusb庫      1、到官網下載最新的libusb原始碼(1.0.22)      2、解壓原始碼      3、進入解壓後的資料夾進行交叉編譯      5、將動態庫複製到當前系統的/lib下      6、l

linux平臺ffmpeg+h.264的本機移植交叉編譯

本文講解在ubuntu和arm平臺下的ffmpeg和x264相關庫的移植,最終實現使用ffmpeg進行H.264編碼。 1、原始碼下載: 2、編譯     2.1、yasm-1.2.0移植       PC可使用如下命令對yasm庫進行配置、編譯和安裝,庫

xml2 交叉編譯移植

首先下載xml2原始碼,這裡使用libxml2-2.7.8.tar.gz 下載地址:ftp://xmlsoft.org/libxml2/ 我放到了/home/zjf下面,然後解壓 執行./configure --prefix=/home/zjf/libxml2-2.7.8/install

RTL2832U+R820T電視棒程式交叉編譯在嵌入式中的使用問題解決

1、交叉編譯libusb 1)下載原始碼libusb-1.0.22.tar.bz2 2)解壓:tar -jxvf libusb-1.0.22.tar.bz2 3)進入目錄cd libusb-1.0.22,生成待安裝的目錄mkdir install(交叉編譯好的庫

iOS攻防:ssh登陸交叉編譯

簡介 iOS攻防系列大家耳熟能詳的是我們iOS女神念茜的系列文章。博主在看了之後也進行了一系列的學習和嘗試。念茜的文章寫的比較早,有很多文章中提到的東西已經不再適合現在使用,寫的也不算詳細,很多地方一筆帶過,卻不是那麼好探索。在中間也有很多摸索的過程。 所以本系列文章算是對念茜

GDB arm-linux交叉編譯移植和使用方法(特別是對於正在執行的程式或者段錯誤的程式進行分析)

測試程式碼中的test1是用來定位堆疊段錯誤,Delay函式是用來定位程式阻塞,都可以用gdb定位出來,如下:  (1)測試程式執行時首先會有個段錯誤:./gdbtest & [[email protected] user0]$ [65334.020000] pgd = c3e14000 [

使用 Android NDK 的交叉編譯工具鏈移植 C/C++ 專案到安卓平臺

什麼是 NDK? Android NDK 是一套可以讓開發者在安卓應用開發中使用 C/C++ 實現特定模組的工具集,不是所有應用都需要用到,但是正確地使用可以有效提高應用執行效率和安全性。 為什麼要在安卓開發中使用 NDK? 遊戲引擎使用 Native 的 C/C++

編譯原理--編譯器的自舉移植

看的編譯原理,發現挺好玩的東西:自舉和移植。有個著名的問題:Mommy, where do compilers come from?要解決這個問題,首先來看看T-Diagram。可以將編譯器用一個T形圖來表示: ---------| S     T | ---   ---     | I |    ---其