编译出现undefined reference to 'i2c_master_init'错误,求解决
解决SAMD21项目中
undefined reference to 'i2c_master_init'链接错误 这个错误说白了就是链接器找不到i2c_master_init函数的实际实现代码——你项目里只有这个函数的声明(在i2c_master.h里),但要么没写对应的实现,要么实现文件没被正确加入编译流程,咱们一步步来排查:
1. 先确认有没有对应的实现文件
首先检查你的项目目录里,是不是有和i2c_master.h配对的i2c_master.c文件(也可能叫i2c_driver.c这类类似名字):
- 如果没有:要是你自己写驱动,就得补全
i2c_master_init的函数实现;要是用的Atmel官方库(比如ASF),那得确认你已经正确导入了I2C相关的模块。 - 如果有,接着往下看。
2. 确认实现文件已经加入Atmel Studio项目
就算有.c文件,没加到项目里也不会被编译:
- 在Atmel Studio的Solution Explorer里,右键你的项目 → Add → Existing Item;
- 找到你的
i2c_master.c文件,添加进去; - 重新编译项目,看看错误是不是没了。
3. 检查函数声明和实现是不是完全匹配
要是文件已经加了还报错,可能是声明和定义对不上:
- 打开
i2c_master.h,看i2c_master_init的声明,比如是不是这样:void i2c_master_init(TWI_t *twi, uint32_t baudrate, uint32_t cpu_hz); - 再打开对应的
.c文件,核对函数定义的签名:返回值、参数类型、参数个数必须完全一致,还要注意函数有没有被static修饰——要是加了static,这个函数就只能在当前.c文件里用,外部调用就会出现链接错误。
4. 排查编译宏和链接配置
- 看看
.c文件里是不是有类似#ifdef SOME_MACRO的条件编译,把i2c_master_init的实现给屏蔽了,而你的项目没定义这个宏; - 右键项目 → Properties → Toolchain → ARM GCC Compiler → Preprocessor,检查预定义宏是不是正确;
- 再去Properties → Toolchain → ARM GCC Linker,确认没漏掉必要的库文件或者对象文件。
额外提示(结合编译输出)
如果你的编译输出里只针对这个函数报undefined reference,大概率是前面1-3步的问题。比如要是输出里没看到i2c_master.o这个目标文件,那肯定是.c文件没被编译,回到第二步重新确认。
内容的提问来源于stack exchange,提问作者Ben Volz
相关产品推荐
相关产品推荐

