【问题标题】:cross-compile with dependencies: how to get target dependencies on host?与依赖项交叉编译:如何获取主机上的目标依赖项?
【发布时间】:2016-09-28 23:12:46
【问题描述】:

我一直在努力在运行 Ubuntu 16.04

的 x64 双 Xeon 上为 arm 交叉编译 OpenCV

我了解交叉编译器的工作原理,编译一个简单的项目就可以了,但是 OpenCV 有很多依赖项。

我不明白如何在用于交叉编译的主机上加载这些依赖项(仅限标头?)

我试过了

dpkg --add-architecture armhf

我已经尝试在 sources.list 中添加 url 来安装依赖项。

我尝试安装带有 :armhf 后缀的依赖项,但这些依赖项本身往往具有依赖项,我最终得到以下形式的错误:cannot install

我也尝试过使用

apt-get build-dep --download-only <dependency>:armhf

但这似乎没有帮助。

所以,首先我想了解:

  • 我需要带有源代码的依赖库,还是只需要标头?我想我只需要标题,但我现在很困惑。

  • 为了交叉编译,我需要做些什么来获取主机上的依赖项?

很抱歉,如果它含糊不清;我只是不确定在哪里寻找这个。我看到的每个关于交叉编译的教程都将依赖关系放在一边,而关于交叉编译的 OpenCV 项目解释假设读者已经知道这一切......

感谢您的帮助

编辑

我在下面添加了我的解决方案,但我觉得这个解决方案并不理想,因为它需要先在目标上安装所有东西。 显然,目标上无论如何都需要依赖项,但运行时不需要所有开发库和头文件

所以我还在寻找更好的解决方案

【问题讨论】:

    标签: c++ opencv arm cross-compiling


    【解决方案1】:

    我设法交叉编译,但有点痛苦。

    到目前为止,我发现获取编译主机上的依赖项的唯一方法是简单地从我安装它们的目标复制文件。

    需要的文件夹大多是

    • /usr(尤其是usr/include/usr/lib/usr/bin
    • /lib
    • /opt(如果你有任何特殊的库设置)

    您可以将这些文件夹 tar 并复制到主机,或使用 rsync。

    之后,您必须确保使用cmake配置路径。

    我将内容复制到与opencv 处于同一级别的名为sysroot-chip 的文件夹中,并且我的构建目录也在同一级别(在opencv 之外)

    并将以下标志添加到cmake

    -D INCLUDE_DIRECTORIES=../sysroot-chip/usr/lib \
    -D INCLUDE_DIRECTORIES=../sysroot-chip/usr/bin \
    -D INCLUDE_DIRECTORIES=../sysroot-chip/opt/lib \
    -D INCLUDE_DIRECTORIES=../sysroot-chip/lib \
    -D PYTHON2_INCLUDE_PATH=../sysroot-chip/usr/include/python2.7 \
    -D PYTHON2_LIBRARIES=../sysroot-chip/usr/lib/python2.7 \
    -D PYTHON2_NUMPY_INCLUDE_DIRS=../sysroot-chip/usr/lib/python2.7/dist-packages \
    -D PYTHON3_INCLUDE_PATH=../sysroot-chip/usr/include/python3.4 \
    -D PYTHON3_LIBRARIES=../sysroot-chip/usr/lib/python3.4 \
    -D PYTHON3_NUMPY_INCLUDE_DIRS=../sysroot-chip//usr/lib/python3.4/dist-packages \
    

    连同交叉编译工具链标志:

    -D CMAKE_TOOLCHAIN_FILE=../opencv-3.1.0/platforms/linux/arm-gnueabi.toolchain.cmaketoolchain.cmake \
    

    【讨论】:

    • 我不知道 Cmake,但如果它能让你简单地将 --sysroot=../sysroot-chip 添加到 CFLAGS/LDFLAGS 和朋友,那应该比单独覆盖每个组件更容易。
    • 我会试试的。谢谢你的提示。你知道在主机上安装目标库的其他方法吗?
    • 如上所述,真的 - 最终需要组合一个 sysroot 来构建。对于“hello world”,交叉编译器中包含的一个简单的可能就足够了;如果您的主机发行版提供 all 正确版本的头文件和库以匹配目标,all 以可多架构安装的方式打包,那么您可能可以直接执行此操作在主机文件系统内;在最坏的情况下,某些东西根本不可能交叉编译,你最终会通过用户模式 ​​QEMU 技巧将整个外国发行版解压缩到 chroot 中,以便“本地”构建。
    • sysroot 作为全局的在这里不起作用,主要是因为它使用 python 来配置一些东西,所以它试图在主机上使用目标的 python。我正在尝试使用 sshfs 来避免将所有内容复制到主机... WIP
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2020-04-10
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多