内联函数链接器错误

sta*_*tor 28 c++ inline linker-errors

我正在尝试使用特定类的内联成员函数.例如,没有内联的函数声明和实现是这样的:

在头文件中:

int GetTplLSize();
Run Code Online (Sandbox Code Playgroud)

在.cpp文件中:

int NeedleUSsim::GetTplLSize()
{
    return sampleDim[1];
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,如果我将"inline"关键字放在实现和声明中的任何一个中,以及两个地方,我都会收到链接器错误,如下所示:

 Creating library C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.x and object C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.exp 
mexfunction.obj : error LNK2019: unresolved external symbol "public: int __thiscall NeedleUSsim::GetTplLSize(void)" (?GetTplLSize@NeedleUSsim@@QAEHXZ) referenced in function _mexFunction 
mexfunction.mexw32 : fatal error LNK1120: 1 unresolved externals 

  C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL: Error: Link of 'mexfunction.mexw32' failed. 

为了摆脱这个错误需要做什么(即在制作这些内联成员函数方面我做错了什么)?

Nik*_*sov 30

您需要将函数定义放入标题中.提示编译器内联的最简单方法是在类声明中包含方法体,如:


class NeedleUSsim
{
  // ...
  int GetTplLSize() const { return sampleDim[1]; }
  // ...
};
Run Code Online (Sandbox Code Playgroud)

或者,如果你坚持单独的声明和定义:


class NeedleUSsim
{
  // ...
  int GetTplLSize() const;
  // ...
};

inline int NeedleUSsim::GetTplLSize() const
{ return sampleDim[1]; }
Run Code Online (Sandbox Code Playgroud)

必须在使用该方法的每个翻译单元中显示该定义.

  • 有些人喜欢把内联函数在一个单独的头文件,包括从主头文件(末),而不是在主头有他们.我个人并不十分相信它(这对我来说感觉好像浪费时间)但如果你喜欢它,那就是另一种选择. (3认同)

you*_*ung 25

来自C++ FAQ Lite

如果将内联函数的定义放入.cpp文件中,并且从其他.cpp文件调用它,则会从链接器中获得"未解析的外部"错误.

你如何告诉编译器使内联成员函数?

  • 不幸的是,正如我刚刚发现的那样,在 MSVC 2013 和 2015 中并非如此。我在 CPP 文件(在库中)中有一个内联,并且它的代码是从一些完全不同的 CPP 源代码中调用的,这些源代码具有自己的同名内联(但代码略有不同,因此结果确实破坏了测试)。我认为这是该开发环境中的一个错误。很难找到... (2认同)

小智 5

正如其他人已经指出的那样,您需要将内联函数的定义移动到头文件中,如下所示:

class NeedleUSsim
{
  // ...
  inline int GetTplLSize() { return sampleDim[1]; }
  // ...
};
Run Code Online (Sandbox Code Playgroud)

原因是编译器在看到对内联函数的调用时需要知道要内联哪些代码。如果将函数的定义保留在NeedleUSsim类的.cpp文件中,则编译器为其生成的代码将被捕获在NeedleUSsim对象文件中。由于编译器仅读取源代码(它不会窥视另一个类的目标文件),因此在编译另一个.cpp文件时,它根本无法知道用什么代码替换调用。