【问题标题】:Link fails when cross compiling OpenCV 3.3.1 for Raspberry Pi Zero even though libraries are present为 Raspberry Pi Zero 交叉编译 OpenCV 3.3.1 时,即使存在库,链接也会失败
【发布时间】:2018-08-08 10:41:09
【问题描述】:

我一直在尝试为 Ubuntu 16.04 上的 Raspberry PI Zero(Raspbian 延伸)构建 OpenCV 3.3.1。我一直按照https://github.com/HesselM/rpicross_notes 此处记录的步骤进行操作,主要例外是,我没有使用具有 GCC 4.9.3 的 https://github.com/raspberrypi/tools 中的工具,而是使用 crosstool-ng 构建 GCC 6.3.0 工具链以匹配 GCC 版本附带 Raspbian 拉伸。我已经在 RaspberryPi Zero 上安装了所有 OpenCV 先决条件,然后获取了文件系统的副本以用作系统根目录。

CMake 配置似乎可以工作,但是在链接 libopencv_freetype.so 时 make 构建失败,因为找不到 harfbuzz 和 freetype 库。

/opt/cross/x-tools/arm-unknown-linux-gnueabihf/bin/../lib/gcc/arm-unknown-linux-gnueabihf/6.3.0/../../../../arm-unknown-linux-gnueabihf/bin/ld: cannot find -lfreetype
/opt/cross/x-tools/arm-unknown-linux-gnueabihf/bin/../lib/gcc/arm-unknown-linux-gnueabihf/6.3.0/../../../../arm-unknown-linux-gnueabihf/bin/ld: cannot find -lharfbuzz
collect2: error: ld returned 1 exit status
modules/freetype/CMakeFiles/opencv_freetype.dir/build.make:97: recipe for target 'lib/libopencv_freetype.so.3.3.1' failed

这些库存在于我的 RaspberryPI 系统中的 usr/lib/arm-linux-gnueabihf

-rw-r--r-- 1 dsnowdon dsnowdon 717178 Apr 27  2017 libfreetype.a
-rw-r--r-- 1 dsnowdon dsnowdon    909 Apr 27  2017 libfreetype.la
lrwxrwxrwx 1 dsnowdon dsnowdon     21 Apr 27  2017 libfreetype.so -> libfreetype.so.6.12.3
lrwxrwxrwx 1 dsnowdon dsnowdon     21 Apr 27  2017 libfreetype.so.6 -> libfreetype.so.6.12.3
-rw-r--r-- 1 dsnowdon dsnowdon 567844 Apr 27  2017 libfreetype.so.6.12.3
-rw-r--r-- 1 dsnowdon dsnowdon 739360 Jan 24  2017 libharfbuzz.a
lrwxrwxrwx 1 dsnowdon dsnowdon     24 Jan 24  2017 libharfbuzz.so -> libharfbuzz.so.0.10400.2
lrwxrwxrwx 1 dsnowdon dsnowdon     24 Jan 24  2017 libharfbuzz.so.0 -> libharfbuzz.so.0.10400.2
-rw-r--r-- 1 dsnowdon dsnowdon 551256 Jan 24  2017 libharfbuzz.so.0.10400.2

使用 make VERBOSE=1 构建显示运行此命令时发生故障:

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

生成这个:

/opt/cross/x-tools/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-g++ -fPIC   -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include/arm-linux-gnueabihf -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/local/include   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections  -mfp16-format=ieee -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG  -shared -Wl,-soname,libopencv_freetype.so.3.3 -o ../../lib/libopencv_freetype.so.3.3.1 CMakeFiles/opencv_freetype.dir/src/freetype.cpp.o ../../lib/libopencv_imgproc.so.3.3.1 -ldl -lm -lpthread -lrt ../../3rdparty/lib/libtegra_hal.a -lfreetype -lharfbuzz ../../lib/libopencv_core.so.3.3.1

但是,如果我手动添加 -L${RPI_ROOTFS}/usr/lib/arm-linux-gnueabihf 以提供以下内容,则链接有效:

/opt/cross/x-tools/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-g++ -L/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf -fPIC   -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include/arm-linux-gnueabihf -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/local/include   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections  -mfp16-format=ieee -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG  -shared -Wl,-soname,libopencv_freetype.so.3.3 -o ../../lib/libopencv_freetype.so.3.3.1 CMakeFiles/opencv_freetype.dir/src/freetype.cpp.o ../../lib/libopencv_imgproc.so.3.3.1 -ldl -lm -lpthread -lrt ../../3rdparty/lib/libtegra_hal.a -lfreetype -lharfbuzz ../../lib/libopencv_core.so.3.3.1

这让我想到,也许 pkg-config 被调用的方式没有发出正确的 libdir,所以我编写了一个包装脚本来转储所有 pkg​​-config 调用和结果。

#! /bin/bash
LOGFILE=/tmp/pkg-config-wrapper.log
basename="`basename "$0"`"  
timestamp=$(date)
printf "${timestamp} ${basename} $@\nPKG_CONFIG_DIR=${PKG_CONFIG_DIR}\nPKG_CONFIG_LIBDIR=${PKG_CONFIG_LIBDIR}\nPKG_CONFIG_SYSROOT_DIR=${PKG_CONFIG_SYSROOT_DIR}\n"  >> $LOGFILE
result=$(/usr/bin/pkg-config "$@")
printf "pkf-config = ${result}\n"  >> $LOGFILE
echo $result

这是我发现的与链接相关的 harfbuzz(为了简洁起见,我省略了 pkg-config cflags 的其他调用,用于 freetype 和 gtk):

Wed  8 Aug 06:33:54 BST 2018 pkg-config-wrapper.sh --exists
--print-errors --short-errors harfbuzz
PKG_CONFIG_DIR=
PKG_CONFIG_LIBDIR=:/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/usr/share/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/opt/vc/lib/pkgconfig
PKG_CONFIG_SYSROOT_DIR=/opt/software/raspberrypi/rpi-cross/rootfs
pkg-config = 
Wed  8 Aug 06:33:54 BST 2018 pkg-config-wrapper.sh --modversion
harfbuzz  
PKG_CONFIG_DIR=
PKG_CONFIG_LIBDIR=:/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/usr/share/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/opt/vc/lib/pkgconfig
PKG_CONFIG_SYSROOT_DIR=/opt/software/raspberrypi/rpi-cross/rootfs
pkg-config = 1.4.2
Wed  8 Aug 06:33:54 BST 2018 pkg-config-wrapper.sh --variable=prefix
harfbuzz  
PKG_CONFIG_DIR=
PKG_CONFIG_LIBDIR=:/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/usr/share/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/opt/vc/lib/pkgconfig
PKG_CONFIG_SYSROOT_DIR=/opt/software/raspberrypi/rpi-cross/rootfs
pkg-config = /usr

Wed  8 Aug 06:33:54 BST 2018 pkg-config-wrapper.sh --variable=libdir
harfbuzz  
PKG_CONFIG_DIR=
PKG_CONFIG_LIBDIR=:/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/usr/share/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/opt/vc/lib/pkgconfig
PKG_CONFIG_SYSROOT_DIR=/opt/software/raspberrypi/rpi-cross/rootfs
pkg-config = /usr/lib/arm-linux-gnueabihf
Wed  8 Aug 06:33:54 BST 2018 pkg-config-wrapper.sh --libs-only-l
harfbuzz  
PKG_CONFIG_DIR=
PKG_CONFIG_LIBDIR=:/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/usr/share/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/opt/vc/lib/pkgconfig
PKG_CONFIG_SYSROOT_DIR=/opt/software/raspberrypi/rpi-cross/rootfs
pkg-config = -lharfbuzz
Wed  8 Aug 06:33:55 BST 2018 pkg-config-wrapper.sh --static
--libs-only-l harfbuzz 
PKG_CONFIG_DIR=
PKG_CONFIG_LIBDIR=:/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/usr/share/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/opt/vc/lib/pkgconfig
PKG_CONFIG_SYSROOT_DIR=/opt/software/raspberrypi/rpi-cross/rootfs
pkg-config = -lharfbuzz -lglib-2.0 -lpcre -lgraphite2
Wed  8 Aug 06:33:55 BST 2018 pkg-config-wrapper.sh --libs-only-L
harfbuzz  
PKG_CONFIG_DIR=
PKG_CONFIG_LIBDIR=:/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/usr/share/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/opt/vc/lib/pkgconfig
PKG_CONFIG_SYSROOT_DIR=/opt/software/raspberrypi/rpi-cross/rootfs
pkg-config = -L/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf
Wed  8 Aug 06:33:55 BST 2018 pkg-config-wrapper.sh --static
--libs-only-L harfbuzz 
PKG_CONFIG_DIR=
PKG_CONFIG_LIBDIR=:/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/usr/share/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/opt/vc/lib/pkgconfig
PKG_CONFIG_SYSROOT_DIR=/opt/software/raspberrypi/rpi-cross/rootfs
pkg-config = -L/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf
Wed  8 Aug 06:33:55 BST 2018 pkg-config-wrapper.sh --libs
harfbuzz  
PKG_CONFIG_DIR=
PKG_CONFIG_LIBDIR=:/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/usr/share/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/opt/vc/lib/pkgconfig
PKG_CONFIG_SYSROOT_DIR=/opt/software/raspberrypi/rpi-cross/rootfs
pkg-config = -L/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf -lharfbuzz
Wed  8 Aug 06:33:55 BST 2018 pkg-config-wrapper.sh --static
--libs harfbuzz 
PKG_CONFIG_DIR=
PKG_CONFIG_LIBDIR=:/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/usr/share/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/opt/vc/lib/pkgconfig
PKG_CONFIG_SYSROOT_DIR=/opt/software/raspberrypi/rpi-cross/rootfs
pkg-config = -L/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf -lharfbuzz -lglib-2.0 -pthread -lpcre -pthread -lgraphite2
Wed  8 Aug 06:33:55 BST 2018 pkg-config-wrapper.sh --libs-only-other
harfbuzz  
PKG_CONFIG_DIR=
PKG_CONFIG_LIBDIR=:/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/usr/share/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/opt/vc/lib/pkgconfig
PKG_CONFIG_SYSROOT_DIR=/opt/software/raspberrypi/rpi-cross/rootfs
pkg-config = 
Wed  8 Aug 06:33:55 BST 2018 pkg-config-wrapper.sh --static
--libs-only-other harfbuzz 
PKG_CONFIG_DIR=
PKG_CONFIG_LIBDIR=:/opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/usr/share/pkgconfig:/opt/software/raspberrypi/rpi-cross/rootfs/opt/vc/lib/pkgconfig
PKG_CONFIG_SYSROOT_DIR=/opt/software/raspberrypi/rpi-cross/rootfs
pkg-config = -pthread

据我所知,pkg-config 被正确调用以进行交叉编译,所以现在我不知所措,不知道下一步该尝试什么。

我正在调用 CMake,如下所示:

cmake \
-D RPI_ROOTFS=${RPI_ROOTFS} \
-D BUILD_TESTS=NO \
-D BUILD_PERF_TESTS=NO \
-D BUILD_PYTHON_SUPPORT=ON \
-D OPENCV_EXTRA_MODULES_PATH=${RPI_CROSS_HOME}/src/opencv_contrib-3.3.1/modules \
-D CMAKE_TOOLCHAIN_FILE=${RPI_CROSS_HOME}/src/opencv-3.3.1/platforms/linux/arm.toolchain.cmake \
${RPI_CROSS_HOME}/src/opencv-3.3.1

OpenCV Cmake 文件的大部分更改都在opencv-3.3.1/cmake/OpenCVMinDepVersions.cmake 中,如https://github.com/HesselM/rpicross_notes 中所述

set(MIN_VER_CMAKE 2.8.12.2)
set(MIN_VER_CUDA 6.5)
set(MIN_VER_PYTHON2 2.6)
set(MIN_VER_PYTHON3 3.2)
set(MIN_VER_ZLIB 1.2.3)
set(MIN_VER_GTK 2.18.0)

# install dir
set( CMAKE_INSTALL_PREFIX ${RPI_ROOTFS}/usr/local CACHE STRING "")
set( CMAKE_FIND_ROOT_PATH "${RPI_ROOTFS}" CACHE FILEPATH "")
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )

# compilers
set( CMAKE_C_COMPILER   "/opt/cross/x-tools/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-gcc"    CACHE FILEPATH "")
set( CMAKE_CXX_COMPILER "/opt/cross/x-tools/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-g++"    CACHE FILEPATH "")
set( CMAKE_AR           "/opt/cross/x-tools/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-ar"     CACHE FILEPATH "")
set( CMAKE_RANLIB       "/opt/cross/x-tools/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-ranlib" CACHE FILEPATH "")

#Pkg-config settings
set( RPI_PKGCONFIG_LIBDIR "${RPI_PKGCONFIG_LIBDIR}:${RPI_ROOTFS}/usr/lib/arm-linux-gnueabihf/pkgconfig" )
set( RPI_PKGCONFIG_LIBDIR "${RPI_PKGCONFIG_LIBDIR}:${RPI_ROOTFS}/usr/share/pkgconfig" )
set( RPI_PKGCONFIG_LIBDIR "${RPI_PKGCONFIG_LIBDIR}:${RPI_ROOTFS}/opt/vc/lib/pkgconfig" )

#set( PKG_CONFIG_EXECUTABLE "/usr/bin/pkg-config" CACHE FILEPATH "")
set( PKG_CONFIG_EXECUTABLE "/opt/cross/pkg-config-wrapper.sh" CACHE FILEPATH "")
set( ENV{PKG_CONFIG_DIR}         "" CACHE FILEPATH "")
set( ENV{PKG_CONFIG_LIBDIR}      "${RPI_PKGCONFIG_LIBDIR}" CACHE FILEPATH "")
set( ENV{PKG_CONFIG_SYSROOT_DIR} "${RPI_ROOTFS}" CACHE FILEPATH "")

# setup rpi (target) directories for compiler
set( RPI_INCLUDE_DIR "${RPI_INCLUDE_DIR} -isystem ${RPI_ROOTFS}/usr/include/arm-linux-gnueabihf")
set( RPI_INCLUDE_DIR "${RPI_INCLUDE_DIR} -isystem ${RPI_ROOTFS}/usr/include")
set( RPI_INCLUDE_DIR "${RPI_INCLUDE_DIR} -isystem ${RPI_ROOTFS}/usr/local/include")

set( RPI_LIBRARY_DIR "${RPI_LIBRARY_DIR} -Wl,-rpath ${RPI_ROOTFS}/usr/lib/arm-linux-gnueabihf")
set( RPI_LIBRARY_DIR "${RPI_LIBRARY_DIR} -Wl,-rpath ${RPI_ROOTFS}/lib/arm-linux-gnueabihf")

# Setup C/CXX flags.
set( CMAKE_CXX_FLAGS        "${CMAKE_CXX_FLAGS} ${RPI_INCLUDE_DIR}" CACHE STRING "" FORCE)
set( CMAKE_C_FLAGS          "${CMAKE_CXX_FLAGS} ${RPI_INCLUDE_DIR}" CACHE STRING "" FORCE)
set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${RPI_LIBRARY_DIR}" CACHE STRING "" FORCE)

#Python2.7
set( PYTHON_EXECUTABLE          /usr/bin/python2.7 CACHE STRING "")
set( PYTHON_LIBRARY_DEBUG       "${RPI_ROOTFS}/usr/lib/arm-linux-gnueabihf/libpython2.7.so" CACHE STRING "")
set( PYTHON_LIBRARY_RELEASE     "${RPI_ROOTFS}/usr/lib/arm-linux-gnueabihf/libpython2.7.so" CACHE STRING "")
set( PYTHON_LIBRARY             "${RPI_ROOTFS}/usr/lib/arm-linux-gnueabihf/libpython2.7.so" CACHE STRING "")
set( PYTHON_INCLUDE_DIR         "${RPI_ROOTFS}/usr/include/python2.7" CACHE STRING "")
set( PYTHON2_NUMPY_INCLUDE_DIRS "${RPI_ROOTFS}/usr/lib/python2.7/dist-packages/numpy/core/include" CACHE STRING "")
set( PYTHON2_PACKAGES_PATH      "${RPI_ROOTFS}/usr/local/lib/python2.7/site-packages" CACHE STRING "")

我还根据https://github.com/HesselM/rpicross_notes 将“-mthumb”替换为“-marm”来更改opencv-3.3.1/platforms/linux/arm.toolchain.cmake 来给出这个

if(COMMAND toolchain_save_config)
  return() # prevent recursive call
endif()

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)
if(NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
  set(CMAKE_SYSTEM_PROCESSOR arm)
else()
  #message("CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}")
endif()

include("${CMAKE_CURRENT_LIST_DIR}/gnu.toolchain.cmake")

if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm AND NOT ARM_IGNORE_FP)
  set(FLOAT_ABI_SUFFIX "")
  if(NOT SOFTFP)
set(FLOAT_ABI_SUFFIX "hf")
  endif()
endif()

if(NOT "x${GCC_COMPILER_VERSION}" STREQUAL "x")
  set(__GCC_VER_SUFFIX "-${GCC_COMPILER_VERSION}")
endif()

if(NOT DEFINED CMAKE_C_COMPILER)
  find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-gcc${__GCC_VER_SUFFIX})
else()
  #message(WARNING "CMAKE_C_COMPILER=${CMAKE_C_COMPILER} is defined")
endif()
if(NOT DEFINED CMAKE_CXX_COMPILER)
  find_program(CMAKE_CXX_COMPILER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-g++${__GCC_VER_SUFFIX})
else()
  #message(WARNING "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} is defined")
endif()
if(NOT DEFINED CMAKE_LINKER)
  find_program(CMAKE_LINKER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ld${__GCC_VER_SUFFIX} ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ld)
else()
  #message(WARNING "CMAKE_LINKER=${CMAKE_LINKER} is defined")
endif()
if(NOT DEFINED CMAKE_AR)
  find_program(CMAKE_AR NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ar${__GCC_VER_SUFFIX} ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ar)
else()
  #message(WARNING "CMAKE_AR=${CMAKE_AR} is defined")
endif()

if(NOT DEFINED ARM_LINUX_SYSROOT AND DEFINED GNU_MACHINE)
  set(ARM_LINUX_SYSROOT /usr/${GNU_MACHINE}${FLOAT_ABI_SUFFIX})
endif()

if(NOT DEFINED CMAKE_CXX_FLAGS)
  set(CMAKE_CXX_FLAGS           "" CACHE INTERAL "")
  set(CMAKE_C_FLAGS             "" CACHE INTERAL "")
  set(CMAKE_SHARED_LINKER_FLAGS "" CACHE INTERAL "")
  set(CMAKE_MODULE_LINKER_FLAGS "" CACHE INTERAL "")
  set(CMAKE_EXE_LINKER_FLAGS    "" CACHE INTERAL "")

  set(CMAKE_CXX_FLAGS           "${CMAKE_CXX_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
  set(CMAKE_C_FLAGS             "${CMAKE_C_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
  if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
set(CMAKE_CXX_FLAGS           "-marm ${CMAKE_CXX_FLAGS}")
set(CMAKE_C_FLAGS             "-marm ${CMAKE_C_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS    "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,nocopyreloc")
  endif()
  if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
set(ARM_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
  elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
set(ARM_LINKER_FLAGS "-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
  endif()
  set(CMAKE_SHARED_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
  set(CMAKE_MODULE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
  set(CMAKE_EXE_LINKER_FLAGS    "${ARM_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
else()
  #message(WARNING "CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}' is defined")
endif()

if(USE_NEON)
  message(WARNING "You use obsolete variable USE_NEON to enable NEON instruction set. Use -DENABLE_NEON=ON instead." )
  set(ENABLE_NEON TRUE)
elseif(USE_VFPV3)
  message(WARNING "You use obsolete variable USE_VFPV3 to enable VFPV3 instruction set. Use -DENABLE_VFPV3=ON instead." )
  set(ENABLE_VFPV3 TRUE)
endif()

set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${ARM_LINUX_SYSROOT})

if(EXISTS ${CUDA_TOOLKIT_ROOT_DIR})
  set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${CUDA_TOOLKIT_ROOT_DIR})
endif()

set(TOOLCHAIN_CONFIG_VARS ${TOOLCHAIN_CONFIG_VARS}
ARM_LINUX_SYSROOT
ENABLE_NEON
ENABLE_VFPV3
CUDA_TOOLKIT_ROOT_DIR
)
toolchain_save_config()

这是 CMake 输出:

-- General configuration for OpenCV 3.3.1 =====================================
--   Version control:               unknown
-- 
--   Extra modules:
--     Location (extra):            /opt/software/raspberrypi/rpi-cross/src/opencv_contrib-3.3.1/modules
--     Version control (extra):     unknown
-- 
--   Platform:
--     Timestamp:                   2018-08-08T05:33:57Z
--     Host:                        Linux 4.15.0-29-generic x86_64
--     Target:                      Linux 1 arm
--     CMake:                       3.5.1
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               Release
-- 
--   CPU/HW features:
--     Baseline:
--       requested:                 DETECT
--       disabled:                  VFPV3 NEON
-- 
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++11:                       YES
--     C++ Compiler:                /opt/cross/x-tools/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-g++  (ver 6.3.0)
--     C++ flags (Release):         -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include/arm-linux-gnueabihf -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/local/include   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections  -mfp16-format=ieee -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
--     C++ flags (Debug):           -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include/arm-linux-gnueabihf -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/local/include   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections  -mfp16-format=ieee -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     C Compiler:                  /opt/cross/x-tools/arm-unknown-linux-gnueabihf/bin/arm-unknown-linux-gnueabihf-gcc
--     C flags (Release):           -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include/arm-linux-gnueabihf -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/local/include  -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include/arm-linux-gnueabihf -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/local/include   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections  -mfp16-format=ieee -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include/arm-linux-gnueabihf -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/local/include  -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include/arm-linux-gnueabihf -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/include -isystem /opt/software/raspberrypi/rpi-cross/rootfs/usr/local/include   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections  -mfp16-format=ieee -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):
--     Linker flags (Debug):
--     ccache:                      NO
--     Precompiled headers:         NO
--     Extra dependencies:          dl m pthread rt
--     3rdparty dependencies:
-- 
--   OpenCV modules:
--     To be built:                 core flann imgproc ml objdetect phase_unwrapping photo plot reg surface_matching video xphoto bgsegm dnn face freetype fuzzy img_hash imgcodecs shape videoio xobjdetect highgui superres bioinspired dpm features2d line_descriptor saliency text calib3d ccalib datasets rgbd stereo structured_light tracking videostab xfeatures2d ximgproc aruco optflow stitching python2
--     Disabled:                    js world contrib_world
--     Disabled by dependency:      -
--     Unavailable:                 cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java python3 ts viz cnn_3dobj cvv dnn_modern hdf matlab sfm
-- 
--   GUI: 
--     QT:                          NO
--     GTK+ 3.x:                    YES (ver 3.22.11)
--     GThread :                    YES (ver 2.50.3)
--     GtkGlExt:                    NO
--     OpenGL support:              NO
--     VTK support:                 NO
-- 
--   Media I/O: 
--     ZLib:                        zlib (ver 1.2.8)
--     JPEG:                        libjpeg (ver 90)
--     WEBP:                        build (ver encoder: 0x020e)
--     PNG:                         build (ver 1.6.24)
--     TIFF:                        build (ver 42 - 4.0.2)
--     JPEG 2000:                   build (ver 1.900.1)
--     OpenEXR:                     build (ver 1.7.1)
--     GDAL:                        NO
--     GDCM:                        NO
-- 
--   Video I/O:
--     DC1394 1.x:                  NO
--     DC1394 2.x:                  YES (ver 2.2.5)
--     FFMPEG:                      NO
--       avcodec:                   YES (ver 57.64.101)
--       avformat:                  YES (ver 57.56.101)
--       avutil:                    YES (ver 55.34.101)
--       swscale:                   YES (ver 4.2.100)
--       avresample:                YES (ver )
--     GStreamer:                   
--       base:                      YES (ver )
--       video:                     YES (ver )
--       app:                       YES (ver )
--       riff:                      YES (ver )
--       pbutils:                   YES (ver )
--     OpenNI:                      NO
--     OpenNI PrimeSensor Modules:  NO
--     OpenNI2:                     NO
--     PvAPI:                       NO
--     GigEVisionSDK:               NO
--     Aravis SDK:                  NO
--     UniCap:                      NO
--     UniCap ucil:                 NO
--     V4L/V4L2:                    NO/YES
--     XIMEA:                       NO
--     Xine:                        NO
--     Intel Media SDK:             NO
--     gPhoto2:                     YES
-- 
--   Parallel framework:            pthreads
-- 
--   Trace:                         YES ()
-- 
--   Other third-party libraries:
--     Use Intel IPP:               NO
--     Use Intel IPP IW:            NO
--     Use VA:                      NO
--     Use Intel VA-API/OpenCL:     NO
--     Use Lapack:                  NO
--     Use Eigen:                   NO
--     Use Cuda:                    NO
--     Use OpenCL:                  YES
--     Use OpenVX:                  NO
--     Use custom HAL:              YES (carotene (ver 0.0.1))
-- 
--   OpenCL:                        <Dynamic loading of OpenCL library>
--     Include path:                /opt/software/raspberrypi/rpi-cross/src/opencv-3.3.1/3rdparty/include/opencl/1.2
--     Use AMDFFT:                  NO
--     Use AMDBLAS:                 NO
-- 
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.12)
--     Libraries:                   /opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/arm-linux-gnueabihf/libpython2.7.so (ver 2.7.13)
--     numpy:                       /opt/software/raspberrypi/rpi-cross/rootfs/usr/lib/python2.7/dist-packages/numpy/core/include (ver undefined - cannot be probed because of the cross-compilation)
--     packages path:               /opt/software/raspberrypi/rpi-cross/rootfs/usr/local/lib/python2.7/site-packages
-- 
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.5.2)
-- 
--   Python (for build):            /usr/bin/python2.7
-- 
--   Java:
--     ant:                         /opt/software/packages/java/apache-ant-1.9.6/bin/ant (ver 1.9.6)
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
-- 
--   Matlab:                        Matlab not found or implicitly disabled
-- 
--   Documentation:
--     Doxygen:                     NO
-- 
--   Tests and samples:
--     Tests:                       NO
--     Performance tests:           NO
--     C/C++ Examples:              NO
-- 
--   Install path:                  /opt/software/raspberrypi/rpi-cross/rootfs/usr/local
-- 
--   cvconfig.h is in:              /opt/software/raspberrypi/rpi-cross/build/opencv
-- -----------------------------------------------------------------
-- 
-- Configuring done
-- Generating done
-- Build files have been written to: /opt/software/raspberrypi/rpi-cross/build/opencv

此时我不知所措,不知道下一步该尝试什么。可能是什么问题?

【问题讨论】:

    标签: cmake raspberry-pi opencv3.0


    【解决方案1】:

    我遇到了同样的问题。对我来说,解决方案是将libfreetype.alibharfbuzz.a 复制到目录/home/alfred/Development/raspi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc/usr/lib/arm-linux-gnueabihf/

    这是编译器和链接器启动的子目录(64位,因为我的ubuntu是64位系统)。

    我认为这只是一个肮脏的解决方法,但我不知道如何使用 cmake 系统修复。如果您找到了更好的解决方案,请告诉我。

    【讨论】:

    • 我会试一试,但我尝试了禁用 freetype (-DBUILD_opencv_freetype=OFF) 的构建,但后来它未能为 gstreamer 获取包含目录时失败了。我遇到的问题看起来不是特定于 freetype 的,只是 freetype 是第一个依赖于外部库的构建命中的库。
    • 我认为编译器和链接器设置指向了错误的头文件和库文件。通过我的解决方法,我遇到了链接错误。我必须目录:
      - ~/Development/raspi_rootfs ... 从 rapis 克隆 - ~/Development/raspi-tools
    • 然后我创建了一个从构建系统到 raspi 克隆的符号链接:~/Development/raspi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc -&gt; /home/alfred/Development/raspi_rootfs。这对我有用。我在 ubuntu18 64bit 上编译了一些测试程序,并在 raspi 上成功运行。旧的libc 已移至备份。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多