内联函数链接器错误

时间:2009-06-05 00:06:20

标签: c++ inline linker-errors

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

头文件中的

int GetTplLSize();
<。>在.cpp文件中:

int NeedleUSsim::GetTplLSize()
{
    return sampleDim[1];
}

出于某种原因,如果我将“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. 

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

5 个答案:

答案 0 :(得分:28)

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


class NeedleUSsim
{
  // ...
  int GetTplLSize() const { return sampleDim[1]; }
  // ...
};

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


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

inline int NeedleUSsim::GetTplLSize() const
{ return sampleDim[1]; }

定义必须在使用该方法的每个翻译单元中可见。

答案 1 :(得分:24)

来自C ++ FAQ Lite

  

如果你把内联函数放了   定义到.cpp文件中,如果是   从其他一些.cpp文件调用,   你会得到一个“未解决的外部”   来自链接器的错误。

How do you tell the compiler to make a member function inline?

答案 2 :(得分:5)

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

class NeedleUSsim
{
  // ...
  inline int GetTplLSize() { return sampleDim[1]; }
  // ...
};

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

答案 3 :(得分:3)

如果你有一个内联函数,你应该把定义放在头文件中。

答案 4 :(得分:0)

请参阅Inline Guard Macro idiom。这将至少允许您将声明中的代码分开(尽管稍微)。它还允许您通过define切换函数内联。