使用NDK 编译C/C++程序遇到 crtbegin_so.o: No such file or directory 等错误

本文介绍了解决在使用Android NDK进行交叉编译过程中遇到的链接错误的方法。通过软链接将必要的crtbegin_so.o和crtend_so.o文件链接到Makefile所在目录,从而解决了编译器无法找到这些文件的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接错误信息截取:

p/p2psdk/p2pRecv.o /work/hw/client/app/p2pc/p2pcFifo.o /work/hw/client/app/p2pc/p2pc.o  -pthread

/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_so.o: No such file or directory

/opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtend_so.o: No such file or directory


分析:其实这两个.o  就在NDK 的交叉编译环境哪里, 但不知道为什么编译器就是死活找不到他,包括指定 -L文件所在的路径;


解决:把该文件链接到Makefile 所在的当前目录:


[root@localhost install]# ln -snf /opt/android-ndk-r9c/platforms/android-12/arch-arm/usr/lib/crtbegin_so.o /work/hw/client/app/
[root@localhost install]# ln -snf /opt/android-ndk-r9c/platforms/android-12/arch-arm/usr/lib/crtend_so.o /work/hw/client/app/

[root@localhost install]# ll /work/hw/client/app/

lrwxrwxrwx 1 root root     72 Mar 23 17:20 crtbegin_so.o -> /opt/android-ndk-r9c/platforms/android-12/arch-arm/usr/lib/crtbegin_so.o
lrwxrwxrwx 1 root root     70 Mar 23 17:20 crtend_so.o -> /opt/android-ndk-r9c/platforms/android-12/arch-arm/usr/lib/crtend


 /work/hw/client/app/ 为Makefile 所在的目录。

### 解决 `fatal error: EGL/egl.h: No such file or directory` 编译错误 当遇到编译过程中报告 `EGL/egl.h: No such file or directory` 的致命错误时,这通常意味着开发环境中缺少必要的图形库支持文件。具体解决方案取决于使用的平台和工具链。 #### 对于 Windows 和 Qt 用户 对于使用 Qt 进行开发的情况,在某些版本特别是 Qt6 中可能出现此问题而 Qt5 则正常工作[^2]。建议尝试切换到更稳定的旧版 Qt 或者确认当前环境配置是否正确包含了 OpenGL ES 库的支持路径。 #### 配置 Android NDK 环境变量 如果是基于 Android NDK 开发的应用程序遇到了这个问题,则可能是由于 API Level 设置不当造成的。通过调整 Application.mk 文件中的参数可以解决问题: ```makefile APP_PLATFORM=android-14 # 提高API级别可能有助于获取更多系统头文件 APP_STL=c++_shared # 使用C++标准模板库共享模式 ``` 此外还需要确保已安装最新版本的 NDK 并将其路径加入系统的 PATH 环境变量中以便命令行工具能够找到所需的资源[^4]。 #### 安装缺失依赖项 有时该错误也表明本地缺乏相应的开发包。以 Ubuntu Linux 发行为例,可以通过下面这条命令来安装 OpenGLES/EGL 相关的开发包: ```bash sudo apt-get install libgles2-mesa-dev ``` 对于其他操作系统,请查阅官方文档了解如何安装对应的软件包。 #### 修改项目源码或构建脚本 如果上述方法均未能有效处理问题,那么应该仔细检查项目的 CMakeLists.txt 或 qmake .pro 文件等构建描述文件,确保它们指定了正确的包含目录以及链接器选项。例如可以在 CMakeLists.txt 添加如下语句指定额外查找位置: ```cmake include_directories(/path/to/your/include/folder) link_directories(/path/to/your/lib/folder) ``` 同时也要注意清理之前的 build 输出并重新运行 make 命令以应用更改后的设置[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值