GLIBC error: Cross-compiling ARMNN on x86_64 (Ubuntu18.04) for ARM Cortex A9(Debian 9)
GLIBC error: Cross-compiling ARMNN on x86_64 (Ubuntu18.04) for ARM Cortex A9(Debian 9)
我在主机系统 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 版本吗?
P.S。 : 非常感谢任何其他解决此问题的方法。
这是我现在能想到的可能选项的列表:
- 运行 您的应用程序
LD_LIBRARY_PATH
指向包含从 x86_64 系统复制的 arm glibc 动态库 (v2.27) 的目录 - 请参阅 this post .
- 如果可能,请在您的目标系统上重新编译您的应用程序,例如,如果您的目标系统可以使用 NFS,
- 交叉编译 library/application 的静态版本,使用
-static -static-libgcc -static-libstdc++
链接它 - 参见 this post.
- 使用 arm-linux-musleabihf-cross 或他的一位朋友交叉编译你的 library/application 的静态版本,如果这不适用于 gcc/g++ 和 glibc。
- 运行 您在 chrooted 环境中的应用程序包含您在 x86_64 系统上链接您的应用程序的 arm 动态库 - 有关详细信息,请参阅 this post,
- 在您的 Cortex-A9 系统上安装 docker,并使用 glibc 2.27 构建一个包含 debian/ubuntu 版本的最小 debian/ubuntu docker 映像,以及您的库和应用程序,并在容器中执行应用程序。
我在主机系统 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 版本吗?
P.S。 : 非常感谢任何其他解决此问题的方法。
这是我现在能想到的可能选项的列表:
- 运行 您的应用程序
LD_LIBRARY_PATH
指向包含从 x86_64 系统复制的 arm glibc 动态库 (v2.27) 的目录 - 请参阅 this post . - 如果可能,请在您的目标系统上重新编译您的应用程序,例如,如果您的目标系统可以使用 NFS,
- 交叉编译 library/application 的静态版本,使用
-static -static-libgcc -static-libstdc++
链接它 - 参见 this post. - 使用 arm-linux-musleabihf-cross 或他的一位朋友交叉编译你的 library/application 的静态版本,如果这不适用于 gcc/g++ 和 glibc。
- 运行 您在 chrooted 环境中的应用程序包含您在 x86_64 系统上链接您的应用程序的 arm 动态库 - 有关详细信息,请参阅 this post,
- 在您的 Cortex-A9 系统上安装 docker,并使用 glibc 2.27 构建一个包含 debian/ubuntu 版本的最小 debian/ubuntu docker 映像,以及您的库和应用程序,并在容器中执行应用程序。