簡體   English   中英

交叉編譯Raspberry Pi的opencv鏈接問題

[英]Cross-Compile for Raspberry pi opencv linking problems

(對不起,英語不好,我是德國人)程序員您好,我正拼命試圖在我的linux(fedora)x86_x64筆記本電腦上交叉編譯一個程序(使用OpenCV),用於linux(樹莓)Raspberry pi 3。

我正在關注本教程( https://solderspot.wordpress.com/2016/02/04/cross-compiling-for-raspberry-pi-part-ii/ )和一個簡單的std :: cout <<“ test \\ n“; 程序可與以下CMakeLists.txt一起編譯並正常工作:

cmake_minimum_required (VERSION 2.8)
project (CVS)
find_package(OpenCV REQUIRED)
SET(COMPILE_DEFINITIONS -Werror)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
add_definitions(-DHOST_ROBO_DIR=/home/username/Dropbox/Roboter)
include_directories(SYSTEM ${PIROOT}/opt/vc/include ${PIROOT}/opt/vc/include/interface/vcos/pthreads ${PIROOT}/opt/vc/include/interface/vmcs_host/linux )
link_directories( ${PIROOT}/opt/vc/lib )
add_executable (CVS ../source/main.cpp)

問題來自於OpenCV ...如果我從上方使用CMakeLists.txt,它會(出於明顯的原因)會產生許多“未定義的引用”錯誤,例如:“對cv :: waitKey(int)的未定義引用”

如果我在CMakeLists.txt中添加“ target_link_libraries(CVS $ {OpenCV_LIBS})”或“ target_link_libraries(CVS -lopencv_core)”,則會產生以下錯誤:/ home / username / pidev / pidev / piroot / usr / local / lib / libopencv_core。所以:未定義引用`std :: __ throw_out_of_range_fmt(char const *,...)@ GLIBCXX_3.4.20'

如果我將〜/ pidev / pi-toolchain.cmake中的“ SET(TOOLROOT $ {PITOOLS} / arm-bcm2708 / gcc-linaro-arm-linux-gnueabihf-raspbian-x64)”替換為“ SET(TOOLROOT $ {PITOOLS} /arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf)“,出現以下錯誤:

[username@MSI-Linux msi]$ cmake -DCMAKE_TOOLCHAIN_FILE=~/pidev/pi-toolchain.cmake .
-- The C compiler identification is GNU 4.9.3
-- The CXX compiler identification is GNU 4.9.3
-- Check for working C compiler: /home/username/pidev/pitools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
-- Check for working C compiler: /home/username/pidev/pitools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc -- broken
CMake Error at /usr/share/cmake/Modules/CMakeTestCCompiler.cmake:61 (message):
  The C compiler
  "/home/username/pidev/pitools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc"
  is not able to compile a simple test program.

  It fails with the following output:

   Change Dir: /home/username/Dropbox/Roboter/raspySync/CVS/cvs5-6/msi/CMakeFiles/CMakeTmp



  Run Build Command:"/usr/bin/gmake" "cmTC_b1abe/fast"

  /usr/bin/gmake -f CMakeFiles/cmTC_b1abe.dir/build.make
  CMakeFiles/cmTC_b1abe.dir/build

  gmake[1]: Verzeichnis
  „/home/username/Dropbox/Roboter/raspySync/CVS/cvs5-6/msi/CMakeFiles/CMakeTmp“
  wird betreten

  Building C object CMakeFiles/cmTC_b1abe.dir/testCCompiler.c.o


  /home/username/pidev/pitools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
  --sysroot=/home/username/pidev/piroot
  -Wl,-rpath-link,/home/username/pidev/piroot/opt/vc/lib
  -Wl,-rpath-link,/home/username/pidev/piroot/lib/arm-linux-gnueabihf
  -Wl,-rpath-link,/home/username/pidev/piroot/usr/lib/arm-linux-gnueabihf
  -Wl,-rpath-link,/home/username/pidev/piroot/usr/local/lib -o
  CMakeFiles/cmTC_b1abe.dir/testCCompiler.c.o -c
  /home/username/Dropbox/Roboter/raspySync/CVS/cvs5-6/msi/CMakeFiles/CMakeTmp/testCCompiler.c


  Linking C executable cmTC_b1abe

  /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b1abe.dir/link.txt
  --verbose=1


  /home/username/pidev/pitools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
  --sysroot=/home/username/pidev/piroot
  -Wl,-rpath-link,/home/username/pidev/piroot/opt/vc/lib
  -Wl,-rpath-link,/home/username/pidev/piroot/lib/arm-linux-gnueabihf
  -Wl,-rpath-link,/home/username/pidev/piroot/usr/lib/arm-linux-gnueabihf
  -Wl,-rpath-link,/home/username/pidev/piroot/usr/local/lib
  CMakeFiles/cmTC_b1abe.dir/testCCompiler.c.o -o cmTC_b1abe -rdynamic


  /home/username/pidev/pitools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.3/../../../../arm-linux-gnueabihf/bin/ld:
  cannot find crt1.o: No such file or directory


  /home/username/pidev/pitools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.3/../../../../arm-linux-gnueabihf/bin/ld:
  cannot find crti.o: No such file or directory

  collect2: error: ld returned 1 exit status

  CMakeFiles/cmTC_b1abe.dir/build.make:97: die Regel für Ziel
  „cmTC_b1abe“ scheiterte

  gmake[1]: *** [cmTC_b1abe] Fehler 1

  gmake[1]: Verzeichnis
  „/home/username/Dropbox/Roboter/raspySync/CVS/cvs5-6/msi/CMakeFiles/CMakeTmp“
  wird verlassen

  Makefile:126: die Regel für Ziel „cmTC_b1abe/fast“ scheiterte

  gmake: *** [cmTC_b1abe/fast] Fehler 2





  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:2 (project)


-- Configuring incomplete, errors occurred!
See also "/home/username/Dropbox/Roboter/raspySync/CVS/cvs5-6/msi/CMakeFiles/CMakeOutput.log".
See also "/home/username/Dropbox/Roboter/raspySync/CVS/cvs5-6/msi/CMakeFiles/CMakeError.log".
[username@MSI-Linux msi]$ 

如果有人可以回答以下問題之一,我將不勝感激:-如何交叉編譯使用OpenCV命令的程序-為什么會有“對`std :: __ throw_out_of_range_fmt(char const *,...)@的未定義引用” GLIBCXX_3.4.20'”和“ C編譯器...無法編譯簡單的測試程序。” -如果我在程序中添加如下內容,它是不好的樣式還是真的不好的樣式:

namespace std
{
void __throw_out_of_range_fmt(char const*, ...) 
{
  std::cout << "throw out of range error\n";
}
}

這是我的〜/ pidev / pi-toolchain.cmake:

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)

SET(DEVROOT $ENV{HOME}/pidev)
SET(PIROOT ${DEVROOT}/piroot)
SET(PITOOLS ${DEVROOT}/pitools)

SET(TOOLROOT ${PITOOLS}/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64)

# specify the cross compiler
SET(CMAKE_C_COMPILER   ${TOOLROOT}/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLROOT}/bin/arm-linux-gnueabihf-g++)

SET(CMAKE_SYSROOT ${PIROOT})
SET(CMAKE_FIND_ROOT_PATH ${PIROOT})


# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

SET(FLAGS "-Wl,-rpath-link,${PIROOT}/opt/vc/lib -Wl,-rpath-link,${PIROOT}/lib/arm-linux-gnueabihf -Wl,-rpath-link,${PIROOT}/usr/lib/arm-linux-gnueabihf -Wl,-rpath-link,${PIROOT}/usr/local/lib")

UNSET(CMAKE_C_FLAGS CACHE)
UNSET(CMAKE_CXX_FLAGS CACHE)

SET(CMAKE_CXX_FLAGS ${FLAGS} CACHE STRING "" FORCE)
SET(CMAKE_C_FLAGS ${FLAGS} CACHE STRING "" FORCE)

“ arm-rpi-4.9.3-linux-gnueabihf”- 工具鏈的已知問題是“找不到crt1.o:沒有這樣的文件或目錄”-錯誤,請參閱4.9工具鏈問題#50

“`std :: __ throw_out_of_range_fmt(char const *,...)@ GLIBCXX_3.4.20'”錯誤與gcc 4.8有關,請參見std :: __ throw_out_of_range_fmt(char const *,…)@ GLIBCXX_3.4.20' 我不太確定為什么會這樣,因為我能夠使用“ gcc-linaro-arm-linux-gnueabihf-raspbian-x64” -toolchain構建opencv。

也許您對我的做法很幸運: 如何交叉編譯帶有附加模塊的Raspberry Pi的OpenCV(highgui ...)

示例CMakeLists.txt

project(Test)
cmake_minimum_required(VERSION 3.2)

set(CMAKE_CXX_STANDARD 11)

aux_source_directory(. SRC_LIST)
find_package(OpenCV REQUIRED)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

像這樣調用cmake:

cmake -D CMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN_FILE -D PIROOT=$MOUNT_DIR -D TOOLROOT=$TOOLCHAIN ..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM