编译用于ARMHF的Crypto++时链接错误

Linking error when compiling Crypto++ for ARMHF

本文关键字:链接 错误 Crypto++ 用于 ARMHF 编译      更新时间:2023-10-16

我正在尝试编译crypto++库以运行于armhf体系结构。我是按照这个答案中提供的方法来做的。我调整了setenv-embed.sh以匹配我的系统配置。运行. ./setenv-embed.sh的输出为

CPP: /usr/bin/arm-linux-gnueabihf-cpp 
CXX: /usr/bin/arm-linux-gnueabihf-g++
AR: /usr/bin/arm-linux-gnueabihf-ar
LD: /usr/bin/arm-linux-gnueabihf-ld
RANLIB: /usr/bin/arm-linux-gnueabihf-gcc-ranlib-4.8
ARM_EMBEDDED_TOOLCHAIN: /usr/bin
ARM_EMBEDDED_CXX_HEADERS: /usr/arm-linux-gnueabihf/include/c++/4.8.2
ARM_EMBEDDED_FLAGS: -march=armv7-a mfloat-abi=hard -mfpu=neon -I/usr/arm-linux-gnueabihf/include/c++/4.8.2 -I/usr/arm-linux-gnueabihf/include/c++/4.8.2/arm-linux-gnueabihf 
ARM_EMBEDDED_SYSROOT: /usr/arm-linux-gnueabihf

表示找到了正确的编译器。但是,当我使用make构建库时,我遇到了以下错误

/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/‌​ld: cannot find /usr/arm-linux-gnueabihf/lib/libc.so.6 inside /usr/arm-linux-gnueabihf
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/‌​ld: cannot find /usr/arm-linux-gnueabihf/lib/libc_nonshared.a inside /usr/arm-linux-gnueabihf        
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/‌​ld: cannot find /usr/arm-linux-gnueabihf/lib/ld-linux-armhf.so.3 inside /usr/arm-linux-gnueabihf

但是当我打开位置/usr/arm-linux-gnueabihf/lib时,我可以找到上面提到的所有三个错误文件,即libc.so.6, libc_nonshared.ald-linux-armhf.so.3

我正在尝试为Beaglebone编译库,如果这有帮助的话。

更新1:

执行一个新的git pull后运行make -f GNUmakefile-cross system的结果

hassan@hassan-Inspiron-7537:~/cryptopp-armhf$ make -f GNUmakefile-cross system
CXX: /usr/bin/arm-linux-gnueabihf-g++
CXXFLAGS: -DNDEBUG -g2 -Os -Wall -Wextra -DCRYPTOPP_DISABLE_ASM -march=armv7-a -mfloat-abi=hard -mfpu=neon -mthumb -I/usr/arm-linux-gnueabihf/include/c++/4.8.2 -I/usr/arm-linux-gnueabihf/include/c++/4.8.2/arm-linux-gnueabihf --sysroot=/usr/arm-linux-gnueabihf -Wno-type-limits -Wno-unknown-pragmas
LDLIBS: 
GCC_COMPILER: 1
CLANG_COMPILER: 0
INTEL_COMPILER: 0
UNALIGNED_ACCESS: 
UNAME: Linux hassan-Inspiron-7537 3.13.0-35-generic #62-Ubuntu SMP Fri Aug 15 01:58:42 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
MACHINE: 
SYSTEM: 
RELEASE: 
make: Nothing to be done for `system'.

问题很简单。它在--sysroot选项中。该选项的值为/usr/arm-linux-gnueabihf/,由链接器使用,生成的库文件夹变为/usr/arm-linux-gnueabihf/usr/arm-linux-gnueabihf/lib/

我从文件gnumakfile -cross的第68行删除了--sysroot选项,所有编译和链接都OK。

然而,由于一些共享库版本不匹配,我无法在BeagleBone Black上运行示例。但这对我来说不是一个真正的问题,因为在我的应用程序中,我静态地链接crypto++,而不是动态地链接。

基于Crosswalking的研究,我想我可以解释是怎么回事。我认为我不同意这个评估"问题很简单。它在--sysroot选项中,因为Crypto++环境脚本和makefile正在按预期工作。

我认为人行横道的答案可能是如何绕过它;但请参阅下面的开放式问题。以下内容来自Crypto++ Issue 134: setenv-embedded.sh和gnumakfile -cross:

我认为这是另一个发行版问题,类似于g++-arm-linux-gnueabi不能编译c++程序——sysroot。这可能是Ubuntu的问题,也可能是Debian的问题上游.

在交叉编译时,我们期望(使用ARMHF):
  • SYSROOT/usr/arm-linux-gnueabihf
  • INCLUDEDIR/usr/arm-linux-gnueabihf/include
  • LIBDIR/usr/arm-linux-gnueabihf/lib
  • BINDIR/usr/arm-linux-gnueabihf/bin

LIBDIR如何演变成/usr/arm-linux-gnueabihf/usr/arm-linux-gnueabihf/lib/(例如,$SYSROOT/$SYSROOT/lib)是个谜。但平心而论,建筑

你可能应该向Debian或Ubuntu(或提供工具链的人)。


对我来说开放的问题是,既然 $SYSROOT/lib 混乱,那么 $SYSROOT/include 混乱了吗?

如果包含目录也混乱,那么交叉编译使用的是主机的包含文件,而不是目标的包含文件。这将导致以后很难诊断问题。

如果 $SYSROOT/include $SYSROOT/lib 都出错了,那么仅仅删除 --sysroot 是不够的。实际上,这是必须要做的:
# Exported by setenv-embedded
export=ARM_EMBEDDED_SYSROOT=/usr/arm-linux-gnueabihf
# Used by the makefile
-I $ARM_EMBEDDED_SYSROOT/$ARM_EMBEDDED_SYSROOT/include
-L $ARM_EMBEDDED_SYSROOT/$ARM_EMBEDDED_SYSROOT/lib

这意味着我们应该能够做以下事情:

# Exported by setenv-embedded
export=ARM_EMBEDDED_SYSROOT=/usr/arm-linux-gnueabihf/usr/arm-linux-gnueabihf
# Used by the makefile
--sysroot="$ARM_EMBEDDED_SYSROOT"

最后,这看起来很像Ubuntu的Bug 1375071: g++-arm-linux-gnueabi不能用——sysroot编译c++程序。bug报告特别提到了…内置路径使用额外的"/usr/arm-linux-gnueabi"

我们需要路径:

)/usr/arm-linux-gnueabi/包括/c++/4.7.3
B)/usr/arm-linux-gnueabi/include/c++/4.7.3 arm-linux-gnueabi

但是内置路径尝试使用:

C)/usr/arm-linux-gnueabi/usr/arm-linux-gnueabi包括/c++/4.7.3
D)/usr/arm-linux-gnueabi/usr/arm-linux-gnueabi包括/c++/4.7.3/arm-linux-gnueabi/科幻E)/usr/arm-linux-gnueabi/usr/arm-linux-gnueabi包括/c++/4.7.3/向后

注意,内置路径使用了额外的"/usr/arm-linux-gnueabi"