lnk4022: 未修饰的符号 - 如何修复?

lnk4022: undecorated symbol - how to fix?

当我 link 我的 C++ DLL 程序时,我收到以下错误和警告:

    Severity    Code    Description Project File    Line    Suppression State
Warning LNK4022 cannot find unique match for symbol 'Init'  MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "void __stdcall Init(void)" (?Init@@YGXXZ) defined in Release\MTF_Garch.obj MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "public: long __thiscall ATL::CComCriticalSection::Init(void)" (?Init@CComCriticalSection@ATL@@QAEJXZ) defined in Release\stdafx.obj    MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "protected: int __thiscall CAppDestinations::Init(void)" (?Init@CAppDestinations@@IAEHXZ) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\mfc140u.lib MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "public: void __thiscall CMFCDragFrameImpl::Init(class CWnd *)" (?Init@CMFCDragFrameImpl@@QAEXPAVCWnd@@@Z) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\mfc140u.lib    MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "protected: void __thiscall CMFCFontComboBox::Init(void)" (?Init@CMFCFontComboBox@@IAEXXZ) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\mfc140u.lib    MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "protected: virtual void __thiscall CMFCPropertyGridCtrl::Init(void)" (?Init@CMFCPropertyGridCtrl@@MAEXXZ) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\mfc140u.lib    MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "protected: void __thiscall CMFCPropertyGridProperty::Init(void)" (?Init@CMFCPropertyGridProperty@@IAEXXZ) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\mfc140u.lib    MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "protected: void __thiscall CMFCToolBarSpinEditBoxButton::Init(void)" (?Init@CMFCToolBarSpinEditBoxButton@@IAEXXZ) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\mfc140u.lib    MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "public: void __thiscall CPaneDivider::Init(int,class CWnd *)" (?Init@CPaneDivider@@QAEXHPAVCWnd@@@Z) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\mfc140u.lib MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "public: void __thiscall CRecentDockSiteInfo::Init(void)" (?Init@CRecentDockSiteInfo@@QAEXXZ) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\mfc140u.lib MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "public: void __thiscall CRecentPaneContainerInfo::Init(void)" (?Init@CRecentPaneContainerInfo@@QAEXXZ) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\mfc140u.lib   MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "protected: void __thiscall CVSListBoxBase::Init(void)" (?Init@CVSListBoxBase@@IAEXXZ) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\mfc140u.lib    MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "public: long __thiscall ATL::CComCriticalSection::Init(void)" (?Init@CComCriticalSection@ATL@@QAEJXZ) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\mfcs140u.lib   MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "public: long __thiscall ATL::CComCriticalSection::Init(void)" (?Init@CComCriticalSection@ATL@@QAEJXZ) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\atls.lib   MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Warning LNK4002 "public: int __thiscall ATL::_stdcallthunk::Init(unsigned long,void *)" (?Init@_stdcallthunk@ATL@@QAEHKPAX@Z) defined in D:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\atlmfc\lib\x86\atls.lib    MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Error   LNK2001 unresolved external symbol Init MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\MTF_Garch\MTF_Garch.def    1   
Error   LNK1120 1 unresolved externals  MTF_Garch   d:\Users\ypx7647\Documents\Visual Studio 2017\Projects\MTF_Garch\Release\MTF_Garch.lib  1   

显然,我的 VS 2017 社区解决方案中存在很多 Init,但我不确定它们来自哪里。

.def 文件是这样的:

LIBRARY   MTF_Garch
EXPORTS  
   Init  @1 
   OnParamsChange   @2  
   Calculate   @3  
   ReplaceStr   @4
   IntrfProcsRec   @5

我的包括:

#include <windows.h>
#include "IndicatorInterfaceUnit.h"
#include "TechnicalFunctions.h"
#include <string>
#include <vector>
#include "Garch.h"

在Garch.h

#include <ql/auto_link.hpp>
#include <ql/quantlib.hpp>
#include <boost/geometry/index/detail/utilities.hpp>
#include <ql/models/volatility/garch.hpp>
#include <ql/math/optimization/simplex.hpp>
#include <ql/math/optimization/levenbergmarquardt.hpp>

我不知道如何使用 ATL 文件,尽管它是我创建的 MFC DLL 解决方案。其余的我不确定它们是什么。

因为我是 C++ 的新手,有人可以告诉我如何告诉 linker 它应该使用哪个 Init(我知道 .def 文件有一个 EXPORT 语法,但还没有能够找到文档)或者我如何摆脱我不需要的所有其他文档。

谢谢。

您需要在 .def 文件中指定要导出的符号的错位名称。我找到这些的通常方法是基于链接器错误消息中未定义符号的名称。我将更新 .def 并重建。

查看您列出的候选项,您可能想要导出 MTF_Garch 文件中定义的符号。将导出文件中的 "Init @1" 行替换为

?Init@@YGXXZ @1

相反。您也可以为其他导出使用损坏的名称,但由于链接器发现只有一个可能的符号,因此它目前不需要它们(但将来可能需要)。