今天在编译一个GigE协议的时候,由于对网络访问很频繁,所以将其中几个接口定义了inline,结果发生各种xxx.c:(.text+0x14a): undefined reference to `xxxxx'的错误

首先排除了没有定义函数的情况,结果发现出问题的这几个函数都是被定义为inline的函数,下面对其做一个说明,大体和现有的网络上答案差不多,我更多的总结一下吧!

 

1)inline typeof(*) xxx(*);内联函数有些类似于宏。内联函数的代码会被直接嵌入在它被调用的地方,调用几次就嵌入几次,没有使用call指令。这样省去了函数调用时的一些额外开 销,比如保存和恢复函数返回地址等,可以加快速度。不过调用次数多的话,会使可执行文件变大,这样会降低速度。相比起宏来说,内核开发者一般更喜欢使用内 联函数。因为内联函数没有长度限制,格式限制。编译器还可以检查函数调用方式,以防止其被误用.linux 内核中内联使用比比皆是,也许就是上面的原因吧,但是更重要的是下面这条原因。

2)static inline的内联函数,一般情况下不会产生函数本身的代码,而是尝试全部被嵌入到被调用的地方,如果不加static,则表示该函数有可能会被其他编译单元所调用,所以一定会产生函数本身的代码。因此加static,一般可令最终可执行文件变小,如果不加static会使最终生成的二进制映像变大,从而会降低访问CPU高速缓存的速度,主要是因为cache是有大小的,一旦超出一级cache就会影响访问速度。所以内核里一般见不到只用inline的情况,而都是使用 static inline。(其他同学也如是认为)

3)这种情况有时候也和编译器版本有关系,可以尝试着去测试,如添加-fgnu89-inline,-std=gun++11,这一条比较灵活需要根据自己编译器以及函数库情况去设置。

4)最后一种解决办法就是在使用的文件中添加extern void xxxx();将内联函数强制生成本身代码,可以通过编译,不推介使用。