undefined reference to 问题的一种解决方法

问题描述:今天在移植mcal中的部分代码时,然后进行编译,在链接的步骤里面,遇见了报错"undefined reference to xxx",未定义的函数被引用的问题,实际上那个函数是被定义了的,不过那个函数比较特殊,是一个被extern inline修饰的定义在头文件中的函数,是extern inline 函数。这种函数可以有两个定义的地方,一个是头文件中,另一个是c文件中,不过是这两个函数的内容必须一模一样,如果其他地方引用这个函数时,是以函数指针的形式进行引用,那么就需要在c文件中也有一个一模一样的定义,c文件中对这个函数的定义就是没有前面的extern inline进行修饰;如果这个函数都是进行普通的函数调用,那么不需要在另外的c文件中进行定义,只需要在头文件中有定义即可。

// lib.c
void libfunc()
{
    /* ... */
}
// lib.h
extern inline libfunc()
{
    /* ... */
}

这里回顾一下c语言的extern和inline相关知识

在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。

extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定。

inline关键字是C99标准的关键字,其作用是将函数展开,把函数的代码复制到每一个调用处。这样调用函数的过程就可以直接执行函数代码,而不发生跳转、压栈等一般性函数操作。可以节省时间,也会提高程序的执行速度。

解决方法:设置编译器的优化选项,最开始是none无优化,设置为balanced后,可以成功编译通过。猜测是,编译器默认将inline进行了disable,由于函数名前面有打开优化选项后,编译器将inline进行了enable。

 本文参考内容:C 语言中的冷门知识点:extern inline 函数 - 知乎extern在c语言中是什么意思?_百度知道c语言inline有什么作用,C语言inline关键字_kyosanto的博客-CSDN博客

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值