链接器错误内联函数

r0x*_*r0x 7 c linker gcc inline

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

  • 啊:在这个文件中定义了一个声明为"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 offoo1'prj/src/main.o :(.text + 0x0):首先在这里定义make:* [kernel]错误1

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

Fat*_*ror 17

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

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

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