编译用于ARMHF的Crypto++时链接错误
Linking error when compiling Crypto++ for ARMHF
我正在尝试编译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.a
和ld-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"
- 静态数据成员的问题-修复链接错误会导致编译器错误
- Visual Studio mkl_link_tool.exe链接错误
- C++ 实现模板单例类时出现链接错误
- 使用类模板的方法链接错误
- MySQL C++连接器链接错误
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 运行 C++ 单元测试时LNK2005链接错误
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 链接错误,包括我创建的相同头文件 - C++
- 在Embarcadero C++ Builder中生成的DLL未解决的外部链接错误
- 使用标头保护的多个定义链接错误
- 链接错误:未定义对 stdscr 和 wgetch 的引用
- 使用 Vivek 的 Vcam / 捕获源过滤器构建/链接错误
- 升压program_options中的链接错误
- 使用 g++ 预处理器进行替换会导致链接错误
- 在调试配置中编译工作正常,但发布会给出链接错误
- 相邻矩阵设置链接错误
- 包含常量变量并包含在多个文件中的标头的链接错误
- C++链接错误,我理解但无法解决
- 是什么导致macOS Mojave上的GoogleTest链接错误