编译Crypto ++ for ARMHF时链接错误

时间:2015-07-29 10:44:36

标签: c++ linker arm embedded crypto++

我正在尝试编译crypto ++库以运行armhf架构。我按照此answer中提供的方法操作。我调整了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.6libc_nonshared.ald-linux-armhf.so.3

我试图为Beaglebone编译库,如果有帮助的话。

更新1:

执行新make -f GNUmakefile-cross system

后运行git pull的结果
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'.

2 个答案:

答案 0 :(得分:1)

问题很简单。它位于--sysroot选项中。此选项的值为/usr/arm-linux-gnueabihf/,链接器将使用它,并生成库文件夹 /usr/arm-linux-gnueabihf/usr/arm-linux-gnueabihf/lib/

我从文件GNUmakefile-cross中的第68行删除了--sysroot选项,并编译和链接了所有内容。

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

答案 1 :(得分:0)

根据Crosswalking的研究,我想我可以解释正在进行的事情。我不认为我同意评估"问题很简单。它位于--sysroot选项" ,因为Crypto ++环境脚本和makefile正在按预期执行。

我认为Crosswalking的回答可能是 如何解决它;但请看下面的开放式问题。以下内容来自Crypto++ Issue 134: setenv-embedded.sh and GNUmakefile-cross

  

我认为这是另一个发行版问题,类似于g++-arm-linux-gnueabi cannot compile a C++ program with --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)是一个谜。但平心而论,建设   GCC不是一项微不足道的任务。

     

您应该使用Debian或Ubuntu(或者   谁提供了工具链。

对我来说,未解决的问题是,由于 $SYSROOT/lib 搞砸了,那么 $SYSROOT/include 也搞砸了吗?

如果include目录也搞砸了,那么交叉编译使用的是主机的包含文件,而不是目标包含文件。这将在以后创建难以诊断的问题。

如果 $SYSROOT/include $SYSROOT/lib 都搞砸了,那么仅仅删除 --sysroot < / em>的。实际上,这是必须要做的事情:

# 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 cannot compile a C++ program with --sysroot。错误报告特别指出 ...内置路径使用额外的&#34; / usr / arm-linux-gnueabi&#34;

  

我们需要路径:

     

A)/usr/arm-linux-gnueabi/include/c++/4.7.3
)B)   的/ usr /臂-Linux的gnueabi /包括/ C ++ / 4.7.3 /臂-Linux的gnueabi

     

但内置路径尝试使用:

     

C)/usr/arm-linux-gnueabi/usr/arm-linux-gnueabi/include/c++/4.7.3
  d)   /usr/arm-linux-gnueabi/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi/sf   E)   的/ usr /臂-Linux的gnueabi的/ usr /臂-Linux的gnueabi /包括/ C ++ / 4.7.3 /向后

     

请注意,内置路径使用额外的&#34; / usr / arm-linux-gnueabi&#34;