连接错误内联函数(Linker error inline function)

2019-08-17 02:45发布

我得到了一些编译器/连接错误,我不知道什么是进行正确的方法。 我在这样的情况:

  • 啊:在此文件中被定义声明为“在线”的功能,例如:内嵌无效foo1();
  • BH:在此文件中被定义声明为调用foo1()“内联”的函数:内嵌无效foo2的();
  • main.c中:有一些功能都foo1和foo2的()的调用。

现在,如果我宣布foo1和foo2的在啊和bh为extern内嵌无效我得到了以下错误:

PRJ / SRC / BO:在功能foo1': (.text+0x0): multiple definition of foo1'。PRJ / SRC / main.o :(文本+为0x0):此处首先定义使:* [内核]错误1

什么是允许编译和链接没有错误/我中所描述的情况警告的方式吗?

Answer 1:

从http://gcc.gnu.org/onlinedocs/gcc/Inline.html :

当inline函数不是静态的,那么编译器必须假定有可能是从其他源文件调用; 因为全局符号只能一次在所有程序中定义,该函数必须不能在其他源文件中定义的,所以调用不能被集成。 因此,非静态的内联函数总是以通常的方式编译自身。

换句话说,无static ,它会发出你的内联函数的符号。 如果碰巧在定义的报头的功能和它包括在一个以上的编译单元,则结束了多个(重新定义)符号。 如果您想在标题中的定义,你应该让static



Answer 2:

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

extern inline void foo1()
{
    return;
}

BH

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

main.cpp中

#include "a.h"
#include "b.h"

int main() {
    foo1();
    foo2();
    return 0;
}


Answer 3:

inline定义,你.h文件和.c文件,强制外部定义。

例如:

// File: a.h
inline void foo1(void) { /*...*/ }

// File main.c
#include "a.h"

extern inline void foo1(void);

int main(void)
{
    /*...*/   
}


文章来源: Linker error inline function