链接器错误内联函数

我有一些编译器/链接器错误,我不知道什么是正确的方法来继续。 我遇到这种情况:

  • 啊:在这个文件中定义了一个声明为“inline”的函数,例如:inline void foo1();
  • bh:在这个文件中定义了一个声明为“inline”的函数,它调用foo1():inline void foo2();
  • main.c:foo1和foo2()都有一些函数调用。

现在,如果我在ah和bh中声明foo1和foo2作为extern inline void我得到以下错误:

prj / src / bo:在函数foo1': (.text+0x0): multiple definition of :(。text + 0x0):foo1’prj / src / main.o :(。text + 0x0)的foo1': (.text+0x0): multiple definition of :这里首先定义make: * [kernel]错误1

在我描述的情况下,允许编译和链接而没有错误/警告的方式是什么?

来自http://gcc.gnu.org/onlinedocs/gcc/Inline.html :

当内联函数不是静态函数时,编译器必须假定可能存在来自其他源文件的调用; 由于全局符号只能在任何程序中定义一次,因此不能在其他源文件中定义该函数,因此无法集成其中的调用。 因此,非静态内联函数总是以通常的方式自行编译。

换句话说,如果没有static ,它会为您的内联函数发出一个符号。 如果您碰巧在标头中定义了该函数并将其包含在多个编译单元中,那么您最终会得到多个(重新定义的)符号。 如果要在标题中包含定义,则应将其设置为static

我试了一下,没有得到任何错误

 extern inline void foo1() { return; } 

BH

 extern inline void foo2() { foo1(); return; } 

main.cpp中

 #include "ah" #include "bh" int main() { foo1(); foo2(); return 0; } 

inline定义放在.h文件和.c文件中强制外部定义。

例如:

 // File: ah inline void foo1(void) { /*...*/ } // File main.c #include "ah" extern inline void foo1(void); int main(void) { /*...*/ }