首页 文章

内联函数链接器错误

提问于
浏览
26

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

在头文件中:

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 回答

  • 26

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

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

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

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

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

  • 4

    来自C FAQ Lite

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

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

  • 24

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

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

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

  • 0

    如果您有内联函数,则应将定义放在头文件中 .

  • 3

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

相关问题