2016-10-01 118 views
0

(对不起,英文,我是德国人) 你好程序员, 我正在拼命地在我的linux(fedora)x86_x64笔记本上交叉编译一个程序(使用OpenCV)对于一个Linux(raspian)树莓pi 3.Raspberry pi opencv链接问题的交叉编译

我正在关注本教程(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)”make以下错误: /home/username/pidev/piroot/usr/local/lib/libopencv_core.so:未定义对`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)”我得到了以下错误:

[[email protected] 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". 
[[email protected] msi]$ 

我会感激,如果有人能回答这些问题之一: - 如何我可以交叉编译一个使用OpenCV命令的程序 - 为什么会有一个“未定义的引用到`std :: __ throw_out_of_range_fmt(char const *,...)@ GLIBCXX_3.4.20'”和一个“The C compiler ...不能编译一个简单的测试程序。“ - 这将是坏的或者非常糟糕的风格,如果我添加一个像这样的程序:

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) 

回答

0

“不能找到crt1.o:没有这样的文件或目录“-error是”arm-rpi-4.9.3-linux-gnueabihf“ - 工具链的已知问题,请参见4.9 toolchain issue #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”工具构建opencv。

也许你有一些运气的方式,我做到了:How do I cross compile OpenCV for the Raspberry Pi with additional modules (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 .. 
相关问题