背景
我是ubantu下编译的,到开发板中运行
分析
(在确保文件没有损坏,文件是正常的前提下)可能的原因:权限问题、动态链接库问题,或者可能是环境变量?
先分析权限问题
(执行ls -l 查看文件权限,执行chmod +x设置执行权限)
执行ls -l : 输出是-rwxr-xr-x 1 root root ,可以看到是可执行的
执行uname -m查看cpu架构,再执行file 命令确认一下,都是arm架构
执行cat /proc/version查看内核版本信息
root@TinaLinux:/usr/bin# cat /proc/version Linux version 4.9.191 (book@100ask) (gcc version 5.3.1 20160412 (Linaro GCC 5.3-2016.05) ) #2 PREEMPT Mon May 6 21:55:25 EDT 2024
环境变量
再看环境变量,执行echo $PATH,把可执行文件复制到环境变量中执行,仍然不行
再看动态链接库
查找库
执行arm-linux-readelf -d (arm-linux-readelf是一个用于分析ARM架构ELF格式文件的命令行工具),得到ELF文件的动态链接信息等
Dynamic section at offset 0x2f08 contains 26 entries: Tag Type Name/Value 0x00000001 (NEEDED) Shared library: [libpthread.so.0] 0x00000001 (NEEDED) Shared library: [libc.so.6] 0x0000000c (INIT) 0x10be0
可以发现需要libpthread.so.0库和libc.so.6,在开发板端查看库,进入库文件所在目录cd /lib/(不同的板子库文件存放位置可能有所不同),对比发现这两个库都没有
交叉编译工具链
找到交叉编译工具链的位置,我在项目中使用的是set(CMAKE_C_COMPILER "arm-buildroot-linux-gnueabihf-gcc"),使用which命令查找,执行which arm-buildroot-linux-gnueabihf-gcc,进入交叉编译工具链的库文件文件夹,例如:我的是/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc,库文件(包括静态库 .a
和动态库 .so
)通常存放在与编译器可执行文件同级的 lib
目录下,
最后找到了libc.so.6库,执行ls -l ,得到lrwxrwxrwx 1 book book 12 Oct 20 2022 libc.so.6 -> libc-2.23.so,把libc.so.6和libc-2.23.so复制到开发板中,再把动态连接器复制过去,即ld-2.23.s0(也可能是别的,要注意一下)
最后:得到 version `GLIBC_2.28' not found (required by ./xwProject_v3_202407_write),这下完蛋了,动态链接库行不通,只能使用静态链接的方式了,加上-static
静态链接
在CMake文件中添加set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
,最后重新编译项目,上传到开发板中执行即正常
总结
由于在项目中没有指定静态链接(大多数情况下使用动态链接)(由于我在静态库动态库的应用经验欠缺)导致
现在还有个问题:version `GLIBC_2.28' not found (required by ./xwProject_v3_202407_write)还没解决