簡體   English   中英

內聯函數鏈接器錯誤

[英]inline function linker error

我正在嘗試使用特定類的內聯成員函數。 例如,沒有內聯的函數聲明和實現是這樣的:

在頭文件中:

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.

為了擺脫這個錯誤需要做什么(即在制作這些內聯成員函數方面我做錯了什么)?

您需要將函數定義放入標題中。 提示編譯器內聯的最簡單方法是在類聲明中包含方法體,如:


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

或者,如果你堅持單獨的聲明和定義:


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

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

必須在使用該方法的每個翻譯單元中顯示該定義。

來自C ++ FAQ Lite

如果將內聯函數的定義放入.cpp文件中,並且從其他.cpp文件調用它,則會從鏈接器中獲得“未解析的外部”錯誤。

你如何告訴編譯器使內聯成員函數?

正如其他人已經指出的那樣,您需要將內聯函數的定義移動到頭文件中,如下所示:

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

這樣做的原因是編譯器在看到對內聯函數的調用時需要知道要內聯的代碼。 如果將函數的定義留在針對NeedleUSsim類的.cpp文件中,則編譯器為其生成的代碼將被捕獲在NeedleUSsim對象文件中。 由於編譯器只讀取源代碼 - 它永遠不會窺視另一個類的目標文件 - 它在編譯另一個.cpp文件時根本無法知道用什么代碼替換一個調用。

如果您有內聯函數,則應將定義放在頭文件中。

請參閱Inline Guard宏語成語 這將至少允許您將聲明中的代碼分開(盡管稍微)。 它還允許您通過define來切換函數的內聯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM