内联函数链接器错误

问题描述 投票:0回答:6

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

在头文件中:

int GetTplLSize();

在.cpp文件中:

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

出于某种原因,如果我将“inline”关键字放在实现和声明之一以及这两个位置中,我会收到链接器错误,如下所示:

 创建库 C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1 emplib.x 和对象 C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1 emplib.exp
mexfunction.obj :错误 LNK2019:函数 _mexFunction 中引用的无法解析的外部符号“public: int __thiscall NeedleUSsim::GetTplLSize(void)” (?GetTplLSize@NeedleUSsim@@QAEHXZ)
mexfunction.mexw32:致命错误 LNK1120:1 个未解析的外部

  C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL:错误:“mexfunction.mexw32”的链接失败。

需要做什么才能消除此错误(即,我在制作这些内联成员函数方面做错了什么)?

c++ inline linker-errors
6个回答
37
投票

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


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

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


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

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

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


28
投票

来自 C++ FAQ Lite

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

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


5
投票

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

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

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


4
投票

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


0
投票

请参阅内联防护宏习惯用法。这至少允许您将代码与声明分开,尽管稍微分开。它还允许您通过

define
切换函数内联。


0
投票

当您在头文件中声明函数并将其定义为内联函数时,函数定义需要对所有使用该函数的翻译单元可见。换句话说,内联函数需要在包含头文件的每个翻译单元中定义。

如果要将成员函数保留为内联函数,请确保在使用它们的翻译单元中定义并正确链接它们。或者,您可以将函数定义从 .cpp 文件移动到头文件本身,这将使它们对包含头文件的所有翻译单元可见。

© www.soinside.com 2019 - 2024. All rights reserved.