我正在为Digilent Zybo Zynq-7000(ARMv7 Cortex-A9)写一些C ++ 17代码。我正在使用arm-linux-gnueabihf GCC 8.3 toolchain。我下载了编译器和sysroot。
我可以使用-static
链接器标志来编译和运行项目,但是这会导致巨大的二进制文件,并且如果启用LTO,则会遇到内部编译器错误。
当我尝试使用共享库进行编译时,即使复制了.so
和sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi/lib
文件夹中的所有usr/lib
文件,我也无法在目标设备上运行它。
构建环境中我的Dockerfile的重要部分:
RUN wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
RUN tar xf gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz && \
rm gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
ENV PATH="${PATH}:/home/develop/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin"
RUN wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/sysroot/sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi.tar.xz
RUN mkdir /home/develop/sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi
WORKDIR /home/develop/sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi
RUN tar xf ../sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi.tar.xz && \
rm ../sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi.tar.xz
我的CMake工具链文件:
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
# Specify the cross compiler
SET(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
# Where is the target environment
SET(CMAKE_FIND_ROOT_PATH /home/develop/sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi)
# Search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
-mcpu=cortex-a9 \
-mfpu=neon -mfloat-abi=hard -ftree-vectorize -mvectorize-with-neon-quad"
CACHE STRING "" FORCE)
# Link all libraries statically
# SET(CMAKE_EXE_LINKER_FLAGS " -static"
# CACHE STRING "" FORCE)
我的可执行文件需要的共享库是:
$ arm-linux-gnueabihf-readelf -d bin/test-crypto
Dynamic section at offset 0x5cef0 contains 29 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libpthread.so.0]
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
当我尝试在目标上运行可执行文件时,出现以下错误,因为找不到所需的库:
$ /media/test-crypto
/bin/sh: /media/test-crypto: not found
$ ldd /media/test-crypto
checking sub-depends for 'not found'
checking sub-depends for '/usr/lib/libstdc++.so.6'
checking sub-depends for 'not found'
checking sub-depends for '/lib/libgcc_s.so.1'
checking sub-depends for 'not found'
checking sub-depends for '/lib/libm.so.1'
libc.so.1 => /lib/libc.so.1 (0xb6ea7000)
ld-uClibc.so.1 => /lib/ld-uClibc.so.1 (0xb6f06000)
checking sub-depends for '/lib/libc.so.1'
ld-uClibc.so.1 => /lib/ld-uClibc.so.1 (0xb6f88000)
libpthread.so.0 => not found (0x00000000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00000000)
libm.so.6 => not found (0x00000000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00000000)
libc.so.6 => not found (0x00000000)
libm.so.1 => /lib/libm.so.1 (0x00000000)
libc.so.1 => /lib/libc.so.1 (0x00000000)
/lib/ld-uClibc.so.1 => /lib/ld-uClibc.so.1 (0x00000000)
/lib/ld-uClibc.so.1 => /lib/ld-uClibc.so.1 (0x00000000)
我检查了目标上的/ lib和/ usr / lib文件夹,并且/usr/lib/libstdc++.so.6
和/lib/libgcc_s.so.1
在那,其他三个不在。
当我将所有库从GCC sysroot文件夹复制到SD卡,并将它们添加到LD_LIBRARY_PATH
时,ldd
输出会更改,似乎找到了所有库,但是当我尝试时运行可执行文件,我仍然遇到相同的错误:
$ LD_LIBRARY_PATH=/media/lib ldd /media/test-crypto
checking sub-depends for '/media/lib/libpthread.so.0'
checking sub-depends for '/media/lib/libstdc++.so.6'
checking sub-depends for '/media/lib/libm.so.6'
checking sub-depends for '/media/lib/libgcc_s.so.1'
checking sub-depends for '/media/lib/libc.so.6'
libpthread.so.0 => /media/lib/libpthread.so.0 (0x00000000)
libstdc++.so.6 => /media/lib/libstdc++.so.6 (0x00000000)
libm.so.6 => /media/lib/libm.so.6 (0x00000000)
libgcc_s.so.1 => /media/lib/libgcc_s.so.1 (0x00000000)
libc.so.6 => /media/lib/libc.so.6 (0x00000000)
/lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000)
/lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000)
$ LD_LIBRARY_PATH=/media/lib /media/test-crypto
/bin/sh: /media/test-crypto: not found
我尝试使用/lib
创建从库到/usr/lib
和ln -s /media/lib/* /lib
的符号链接,但这没有用。
我不能将GCC sysroot添加到我们得到的Linux映像的rootfs.cpio归档文件中,因为它太大,然后当我添加太多文件时它不再启动。 SD卡的FAT32文件系统不支持符号链接,并且许多共享库都是符号链接,因此也许是个问题。我尝试使用ext2和ext4代替FAT,但是开发板不支持此功能,如果我尝试使用FAT以外的其他功能,则无法启动。仅为库添加第二个分区也不起作用。
在SD卡上安装必要的库以使我可以运行C / C ++程序的最佳方法是什么?