undefined reference to `_init'问题解决

本文介绍了一种在使用Eclipse CDT进行调试时遇到的未定义引用错误,具体表现为ld返回1退出状态。通过调整工程属性中的Cross ARM C++链接器设置,即取消对某个选项的选择,成功解决了该问题。

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

今天利用CDT 的eclipse调试程序,遇到下面的问题:

d:/plugin/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv7-m\libg_s.a(lib_a-init.o): In function `__libc_init_array':
init.c:(.text.__libc_init_array+0x1c): undefined reference to `_init'
collect2.exe: error: ld returned 1 exit status
make: *** [gg.elf] Error 1

图片格式如下:

查询良久,在与非网上(http://www.infineonic.org/module/forum/thread-601371-1-1.html)发现问题所在:

在工程->property->C/C++ builder->settings->Cross ARM C++ linker->general中的设置是这样的:

将第一个√去掉就可以了

转载于:https://www.cnblogs.com/quray/p/4724506.html

### 链接错误解决方案 链接器错误通常表明某些符号未被正确定义或找到。在这种情况下,`undefined reference to '__init'` 是由 EABI(Embedded Application Binary Interface)工具链引发的常见问题之一。 #### 可能的原因分析 1. **缺失的标准库支持** 如果项目中使用的标准库不完整或者配置不当,则可能导致 `__init` 函数无法解析。这通常是由于编译选项设置有误引起的[^2]。 2. **不同版本的 GCC 或 Clang 工具链冲突** 当前环境中可能存在多个版本的 GCC 或 Clang 编译器。如果目标二进制文件依赖于特定版本的库(例如 GCC 4.6),而实际构建过程中使用的是另一个版本(例如 GCC 4.1),则可能会导致兼容性问题[^3]。 3. **启动代码中的初始化函数丢失** 在嵌入式开发中,许多平台会自动生成一些必要的初始化例程(如 `_start`, `__init`)。这些例程可能因为链接脚本配置错误或其他原因未能正确加载到最终可执行文件中[^4]。 #### 解决方法 以下是几种常见的修复策略: ##### 方法一:检查并调整编译标志 确保 `-nostdlib` 和其他类似的非默认参数仅在必要时才启用。如果没有特殊需求,请允许链接器自动拉取所需的 CRT (C Runtime) 文件以及相关的 startup routines[^2]: ```bash set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -specs=nano.specs") ``` ##### 方法二:验证链接顺序 确认所有静态库(.a)都按照正确的次序传递给链接阶段。特别是当存在相互依赖关系的时候,颠倒它们的位置往往会造成难以察觉的问题。可以尝试通过打印详细的命令行日志(`-v`) 来诊断具体发生了什么情况[^1]: ```makefile LDFLAGS += -Wl,-Map=output.map,--cref -v ``` ##### 方法三:更新至最新稳定版工具链 有时旧版本的交叉编译环境本身即携带缺陷;升级到官方推荐的新发行版能够有效规避此类隐患的同时还获得性能改进和其他方面的增强功能[^3]. ##### 方法四:手动指定入口点 对于那些完全裁剪掉操作系统服务的小型应用来说,显式声明自己的 main 前置处理逻辑不失为一种折衷办法: ```c void __attribute__((section(".text.reset"))) Reset_Handler(void){ SystemInit(); // 初始化硬件资源 Main(); } extern void (* const g_pfnVectors[])(void); asm volatile ( ".global g_pfnVectors\n" "g_pfnVectors = .\n" "dc.w Reset_Handler @ reset vector\n" ... ); ``` --- ### 提供的相关建议 尽管上述措施有助于缓解大部分场景下的同类难题,但具体情况仍需结合项目的实际情况进一步探讨。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值