linux下android模拟器无法启动报错“GLIBC_2.11not found”

本文详细介绍了如何通过下载、解压和替换文件来更新Android SDK中的Linux工具,确保开发者能够使用最新版本的工具进行开发。

1)下载 http://dl-ssl.google.com/Android/repository/tools_r07-linux.zip

2) 解压

3)将解决后的文件替换SDK顶层目录下tools目录中的内容


glib-2.58.0-win64-vs2017-v141-sdk10.0.17134.12 csdn-tags: glib-2.58.0 x64 vs2017v141 sdk17134 glib-2.58.0及其依赖包: bzip2-1.0.6-win64-vc141.zip glib-2.58.0-win64-vc141.zip libiconv-1.15-win64-vc141.zip libintl-0.19.8.1-win64-vc141.zip pcre-8.42-win64-vc141.zip zlib1-1.2.11-win64-vc141.zip 其中: glib依赖 libintl pcre zlib intl依赖 libiconv pcre依赖 bzip2 zlib glib的编译方法: 1,准备工具:msvc2017,python3,python需要安装 meson 和 ninja,直接pip install即可。 2,准备glib:glib需要dirent的支持,否则在编译时会提示无法解析外部符号的错误。解决方法为: 将根目录\build\win32\dirent目录下的二个C文件和一个H文件拷贝到根目录\glib目录下。 3,修改根目录\glib目录下的meson.build文件,字符全是英文半角: glib_sub_headers = files处添加: glib_sub_headers = files( 'dirent.h', glib_sources = files处添加: glib_sources = files( 'dirent.c', 'wdirent.c', 打开vs2017的:适用于 VS 2017的 X64 本机工具命令提示: 或者 call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 假设python安装在D:\platform\python3 则,Scripts目录一定要添加,否则meson.py会找不到: set PYTHONPATH=D:\platform\python3 set PATH=%PATH%;%PYTHONPATH%;%PYTHONPATH%\Scripts\ 然后,创建编译目录,meson用一个新的目录编译源码: mkdir glib-2.58.0-win64-vc141 cd glib-2.58.0-win64-vc141 meson.py ..\glib-2.58.0 --prefix=D:\platform\glib --buildtype=minsize ninja ninja install 就可以完美编译。 欢迎朋友们下载使用。
<think>首先,用户的问题是关于在虚拟机中进行交叉编译时遇到错误:"version GLIBC_2.34 not found"。我需要根据系统指令来构建回答。 系统指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户的问题:在虚拟机中交叉编译时遇到错误 "version GLIBC_2.34 not found",需要解决方案。 参考站内引用: - [^1]: 关于在64位Linux上运行ar工具的错误。 - [^2]: 解释为什么需要编译两次GCC,涉及glibc的依赖。 - [^3]: 列出一些安装包的命令。 这些引用似乎不直接相关,但可能提供一些背景。引用[^2]提到编译glibc需要C支持,这涉及到glibc版本问题。错误"GLIBC_2.34 not found"表明系统缺少所需的glibc版本。 核心问题:交叉编译时出现glibc版本不匹配。可能的原因: - 目标系统(编译后的程序运行的系统)的glibc版本低于2.34。 - 编译环境使用了较新的glibc特性。 - 虚拟机中的工具链配置问题。 解决方案思路: 1. **检查目标系统glibc版本**:确保目标系统支持所需的glibc版本。 2. **使用兼容的工具链**:在交叉编译时,使用与目标系统glibc兼容的工具链。 3. **降低依赖**:如果可能,避免使用高版本glibc的特性。 4. **在虚拟机中安装或更新glibc**:但虚拟机是开发环境,目标系统可能不同。 5. **静态链接**:考虑静态链接glibc,以避免运行时依赖。 从引用[^2]中,编译glibc是交叉工具链的一部分。可能需要重新构建工具链以匹配目标glibc版本。 回答结构: - **解释错误原因**:简要说明错误含义。 - **提供解决方案步骤**:逐步指导如何解决。 - **生成相关问题**:在最后添加相关问题。 使用中文回答。 生成相关问题:基于主题,如交叉编译、glibc版本管理等。 确保回答真实可靠:基于常见Linux开发经验。 最终回答大纲: 1. 介绍错误原因。 2. 解决方案步骤: - 确认目标系统glibc版本。 - 调整编译环境。 - 使用兼容工具链。 - 可选:静态链接或更新目标系统。 3. 结束并添加相关问题。</think>### 虚拟机交叉编译错误 "version GLIBC_2.34 not found" 解决方案 在虚拟机中进行交叉编译时,遇到错误 "version GLIBC_2.34 not found",这通常是由于目标系统(即程序最终运行的环境)的 glibc 版本低于 2.34,而编译环境使用了更高版本的 glibc 特性所致。glibc(GNU C Library)是 Linux 系统的核心库,负责提供基本函数和系统调用。交叉编译时,工具链(如 GCC、binutils)必须与目标系统的 glibc 版本兼容。否则,编译出的程序在目标系统上运行时,会因为缺少高版本符号而失败[^1]。以下我将逐步解释原因并提供解决方案,确保过程清晰可靠。 #### 错误原因分析 - **glibc 版本不匹配**:编译环境(虚拟机)的 glibc 版本为 2.34 或更高,但目标系统(如嵌入式设备或旧版 Linux)的 glibc 版本较低(例如 2.31)。当程序引用高版本 glibc 的符号(如新函数)时,目标系统无法解析。 - **工具链问题**:交叉编译工具链(如交叉 GCC)未正确配置为使用目标系统的 glibc 版本。工具链的第一次编译需要生成支持目标平台的 glibc,如果工具链本身使用了高版本特性,会导致兼容性问题[^2]。 - **虚拟机环境因素**:虚拟机中可能缺少必要的开发库或工具链组件,导致编译时隐式依赖高版本 glibc。 #### 解决方案步骤 遵循以下步骤,逐步解决错误。假设您使用的是 Linux 虚拟机(如 Ubuntu)进行交叉编译,目标系统为 ARM 或 x86 架构的嵌入式设备。 1. **确认目标系统的 glibc 版本** 在目标系统上运行命令检查 glibc 版本: ```bash ldd --version ``` 如果输出显示版本低于 2.34(例如 `ldd (Ubuntu GLIBC 2.31-0ubuntu9.2) 2.31`),则问题确认为版本不匹配。记录此版本号(如 2.31)。 2. **检查虚拟机中的编译环境** 在虚拟机中,确保工具链(交叉 GCC、binutils)与目标 glibc 版本兼容: - 查看交叉编译器的 glibc 支持版本: ```bash <交叉编译器路径>/<target>-gcc --version ``` 例如,对于 ARM 目标:`arm-linux-gnueabihf-gcc --version`。 输出中应包含 glibc 信息。如果版本高于目标系统(如 2.34),需调整工具链。 - 安装必要依赖(如果虚拟机缺少开发库): 引用[^3] 提到的基础包可确保环境完整: ```bash sudo apt-get install gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.6-dev squashfs-tools build-essential zlib1g-dev pngcrush schedtool ia32-libs libncurses5-dev ``` 3. **重新配置或构建兼容的工具链** 这是核心步骤。工具链必须使用目标系统的 glibc 版本构建: - **选项1:使用预编译的低版本工具链** 下载与目标 glibc 版本匹配的交叉工具链。例如,对于 glibc 2.31: - 访问 [Linaro Releases](https://releases.linaro.org/components/toolchain/binaries/) 或 [Bootlin Toolchains](https://toolchains.bootlin.com/),选择对应架构和 glibc 版本的预编译包。 - 安装并设置环境变量: ```bash wget https://example.com/arm-linux-gnueabihf-gcc-8.3.0-glibc-2.31.tar.xz # 替换为实际链接 tar -xvf arm-linux-gnueabihf-gcc-8.3.0-glibc-2.31.tar.xz export PATH=$PATH:/path/to/toolchain/bin ``` - **选项2:手动构建工具链(高级)** 如果预编译工具链不可用,需从源码构建。引用[^2] 解释了编译两次 GCC 的原因:第一次编译生成基础 C 编译器,用于构建目标 glibc;第二次编译完整的交叉工具链。 步骤简述: 1. 下载源码:glibc(目标版本,如 2.31)、binutils、GCC。 2. 第一次编译 GCC(仅 C 支持): ```bash mkdir build-gcc-stage1 && cd build-gcc-stage1 ../gcc-source/configure --target=<target> --prefix=/usr/local/cross --enable-languages=c --disable-threads --disable-libatomic make all-gcc make install-gcc ``` 3. 用此编译器构建目标 glibc: ```bash mkdir build-glibc && cd build-glibc ../glibc-source/configure --host=<target> --prefix=/usr/local/cross/<target> make && make install ``` 4. 第二次编译完整 GCC(支持 C/C++): ```bash mkdir build-gcc-stage2 && cd build-gcc-stage2 ../gcc-source/configure --target=<target> --prefix=/usr/local/cross --enable-languages=c,c++ --with-sysroot=/usr/local/cross/<target> make all && make install ``` 确保 `--with-sysroot` 指向安装的 glibc,这样工具链会链接到正确版本[^2]。 4. **编译时指定兼容性选项** 在交叉编译命令中,强制使用目标 glibc 版本: - 添加编译标志: ```bash <交叉编译器路径>/<target>-gcc -Wl,--version-script=mapfile -nostdlib -static-libgcc your_source.c -o output ``` 其中 `mapfile` 是一个文本文件,定义符号版本: ``` GLIBC_2.31 { }; ``` 这限制程序只使用 glibc 2.31 的符号。 - 或使用静态链接(简单方法,但增大二进制体积): ```bash <交叉编译器路径>/<target>-gcc -static your_source.c -o output ``` 这会嵌入 glibc,避免运行时依赖。 5. **验证解决方案** 编译后,在目标系统上运行程序前,检查二进制依赖: ```bash <交叉编译器路径>/<target>-readelf -d output | grep GLIBC ``` 输出应显示目标 glibc 版本(如 `GLIBC_2.31`),而非 2.34。如果无错误,则问题解决。 #### 注意事项 - **虚拟机 vs. 目标系统**:虚拟机是编译环境,目标系统是运行环境。确保工具链的 `--target` 参数匹配目标架构(如 `arm-linux-gnueabihf`)。 - **性能影响**:手动构建工具链耗时较长(可能数小时),但能彻底解决兼容性问题。 - **备选方案**:如果目标系统可更新,升级其 glibc2.34+(但嵌入式设备通常受限)。 - **常见错误处理**:如果出现类似引用[^1] 的工具链错误(如 `only run on 64-bit linux`),确保虚拟机是 64 位系统并使用 64 位工具链。 通过以上步骤,大多数 "GLIBC_2.34 not found" 错误可被解决。关键在于对齐工具链与目标系统的 glibc 版本[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值