【问题标题】:GLIBC error: Cross-compiling ARMNN on x86_64 (Ubuntu18.04) for ARM Cortex A9(Debian 9)GLIBC 错误:在 x86_64 (Ubuntu18.04) 上为 ARM Cortex A9(Debian 9) 交叉编译 ARMNN
【发布时间】:2020-06-19 07:03:58
【问题描述】:

我为我的主机系统 x86_64 (Ubuntu 18.04) 上的 ARM Cortex-A9 (Debian 9) 设备交叉编译了 ARMNN。

我已经成功构建了 ARMNN 及其所有依赖项,没有任何错误,但是当我尝试在 Cortex-A9 上运行示例 mnist 时,它给出了以下错误:

duu@34d456-45433g:~/ML-examples/armnn-mnist$ make test
arm-linux-gnueabihf-g++ -O3 -std=c++14 -I/home/duu/armnn/armnn/include mnist_caffe.cpp -o mnist_caffe -L/home/duu/build -larmnn -larmnnCaffeParser
/home/admin/build/libarmnn.so: undefined reference to `exp2f@GLIBC_2.27'
/home/admin/build/libarmnn.so: undefined reference to `logf@GLIBC_2.27'
/home/admin/build/libarmnn.so: undefined reference to `log2f@GLIBC_2.27'
/home/admin/build/libarmnn.so: undefined reference to `powf@GLIBC_2.27'
/home/admin/build/libarmnn.so: undefined reference to `expf@GLIBC_2.27'
collect2: error: ld returned 1 exit status
Makefile:12: recipe for target 'mnist_caffe' failed
make: *** [mnist_caffe] Error 1

后来我发现该设备应该具有相同的编译器和相同的 GLIBC 包,两者都具有与编译库的主机相同的版本。

我在主机上使用 gcc-6.4.0 和 glibc-2.27 编译了 ARMNN,在 Cortex-A9 设备上使用 gcc-6.3.0 和 glibc-2.24。

我设法匹配了 GCC 版本并解决了编译器错误,但我无法在 Ubuntu 18.04 和 debian 9 上找到匹配的 GLIBC 版本。

有没有什么方法可以在两个系统中安装一个通用的 GLIBC 版本?

附: :非常感谢任何其他解决此问题的方法。

【问题讨论】:

    标签: makefile cross-compiling ubuntu-18.04 glibc armv7


    【解决方案1】:

    以下是我现在能想到的可能选项列表:

    1. 运行您的应用程序,同时让 LD_LIBRARY_PATH 指向包含从 x86_64 系统复制的 arm glibc 动态库 (v2.27) 的目录 - 请参阅 this post
    2. 如果可能,如果您的目标系统可以使用 NFS,例如,在您的目标系统上重新编译您的应用程序,
    3. 交叉编译库/应用程序的静态版本,使用-static -static-libgcc -static-libstdc++ 链接它 - 请参阅this post
    4. 如果这不适用于 gcc/g++ 和 glibc,请使用 arm-linux-musleabihf-cross 或他的一位朋友交叉编译库/应用程序的静态版本。
    5. 在包含您在 x86_64 系统上链接应用程序的 arm 动态库的 chroot 环境中运行您的应用程序 - 有关详细信息,请参阅 this post
    6. 在您的 Cortex-A9 系统上安装 docker,并构建一个最小的 debian/ubuntu docker 映像,其中包含使用 glibc 2.27 的 debian/ubuntu 版本以及您的库和应用程序,并在容器中执行该应用程序。李>

    【讨论】:

    • 最后一个选项对我有用。但我希望任何其他解决方案都能正常工作,因为它不是一个优化的解决方案。我已经在开发资源受限的嵌入式设备,并且在它上面使用 docker 容器会增加开销。不过,非常感谢您的帮助。
    • 如果您的应用程序不使用 NAT,它在容器中运行时的性能似乎或多或少相同 - 请参阅 here。您是否尝试过上述任何其他解决方案?谢谢。
    • 有更新。我能够在我的目标设备上运行我的应用程序。我将 glibc-2.24 从我的目标复制到主机以及它的一些其他依赖项并编译了框架。它有效。
    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 2019-05-26
    • 2018-01-03
    • 2017-02-11
    • 2020-08-15
    • 2013-04-23
    相关资源
    最近更新 更多