我正在尝试编译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.6
,libc_nonshared.a
和ld-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'.
答案 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;