2015-10-06 95 views
-1

我在.h文件中定義了一個靜態成員函數,該函數工作正常。錯誤LNK2019:將代碼放入cpp文件時無法解析的外部符號

當我試圖將執行文件移動到.cpp文件時,項目編譯失敗,因爲調用此函數的另一個類發生LNK2019錯誤。

錯誤消息:

8>------ Build started: Project: COrders, Configuration: Debug x64 ------ 
8>  Creating library D:\devel\Server\COrders\Debugx64\COrders.lib and object D:\devel\Server\COrders\Debugx64\COrders.exp 
8>OrderProcessor.obj : error LNK2019: unresolved external symbol "public: static bool __cdecl COAValidator::ValidatePercentage(class CSDO const &,class CExecInstHelper const &,class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > const &)" ([email protected]@[email protected]@[email protected]@@[email protected][email protected][email protected]@[email protected]@@@@[email protected]@@Z) referenced in function "private: int __cdecl CPlus::COrderProcessor::DoCreate(int)" ([email protected]@[email protected]@[email protected]) 
8>D:\devel\Server\Server\COrders\Debugx64\COrdersd.dll : fatal error LNK1120: 1 unresolved externals 

這裏COrderProcessor::DoCreate()試圖調用static bool COAValidator::ValidatePercentage(),其中通過.dll

不知道如何解決它提供?

+0

你能顯示代碼至少在這個方法嗎? –

+0

您是否自己創建了包含'COAValidator :: ValidatePercentage()'的'.dll'?您是否使用'__declspec'標記了此方法的輸出? https://msdn.microsoft.com/en-us/library/a90k134d.aspx – atkins

回答

1

當您在.h文件中完全定義此功能時,它將被編譯到任何客戶端代碼中,並且不需要鏈接來定位函數定義。

但是,如果將函數定義移動到.cpp文件,則客戶端代碼在編譯時將不再能看到該定義,並依賴於鏈接器來定位它。因此,必須將該功能標記爲dllexport,以便將其包含在dll的功能表中。

本頁面描述了這樣的語法:https://msdn.microsoft.com/en-us/library/a90k134d.aspx

+0

感謝您的解釋。我們的舊代碼仍然使用'.def'來導出符號,我試圖添加這個函數的簽名,但沒有運氣。 – Deqing

+0

更新:只是通過將錯誤消息中的簽名複製到'def'而再次嘗試。 – Deqing

相關問題