关于version `GLIBC_2.34‘ not found解决办法(非升级glibc库或Linux系统)

关于version `GLIBC_2.34’ not found解决办法

问题来源

源代码

#include "stdio.h"

void main(void)
{
    
    
    printf("Hello World!");
}

使用arm-linux-gnueabihf-gcc交叉编译

arm-linux-gnueabihf-gcc main.c -o main

部署到开发板后运行报错

debian@npi:~$ ./main 
./main: /lib/arm-linux-gnueabihf/libc.so.6: version `GLIBC_2.34' not found (required by ./main)

查询资料

使用bing和百度搜索 version `GLIBC_2.34’ not found 得到的解决办法归纳为一下几点

  • 升级部署环境系统版本,降低打包编译环境的系统版本
  • 在部署环境中下载符合版本的gblc库(一般高于原来的环境)
  • 使用工具gblc-all-in-one文档描述是

这是一个在ubuntu环境下随意更改文件glibc版本的便捷工具

  • 使用静态链接库

    方法一:可以完美解决,但是太傻了,作为开发人员总不能每次开发一个系统就换自己系统的版本吧。
    方法二:看运气,说不定升级了以后开发板的系统命令就用不了了,所以不建议随意升级这个库,具体原因可以
    自行百度。
    方法三:没看懂原理(刚入门)所以也没去尝试。
    方法四:使用静态链接库,缺点是不确定以后会不会出什么问题,而且编译后的文件体积巨大。

整理思路

我查询了交叉编译的指令具体和GCC差不了多少其中有一 -l-L 命令。用于指定链接库的链接目录。具体用法参见GCC -l选项:手动添加链接库,所以我想能不能在编译的的时候指定需要链接的库或目录,这样就不会需要改变双方的环境了。


解决步骤

查找网络发现在编译c语言时候需要用到的库为libc
我不使用编译器自带的而是从开发板上下载了该文件作为编译文件的链接库。
然后在编译的时候指定该文件作为链接目标。

yhw@yhw-virtual-machine:~/gxl$ scp laojia:/lib/libc.so.6 ./   # 从开发板(服务器)系统的/lib目录下找到libc.so.6下载到当前目录
yhw@yhw-virtual-machine:~/gxl$ arm-linux-gnueabihf-gcc main.c -o main ./libc.so.6 #指定刚刚下载的libc.so.6文件作为编译时候链接文件

然后将程序部署到开发板环境运行成功

debian@npi:~$ ./main #运行
Hello World!
debian@npi:

而后尝试用指令-L指定一个目录让编译器从其中查找链接库,这样不用一个一个的输入文件。

yhw@yhw-virtual-machine:~/gxl$ arm-linux-gnueabihf-gcc main.c -o main -L ./lib_dir/ #自行创建文件夹并将文件移入后再执行此步骤

编译通过,完美解决。


总结

使用编译器-l-L选项手动添加从目标系统下载的链接库从而解决gblc版本不匹配的问题。
后续将继续了解一下gblc-all-in-one工具的使用原理。

以下附上命令行图片:
无
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/YuHWEI/article/details/128736804