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

时间:2017-07-24 19:50:28

标签: c++ linker-errors

当我链接我的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 Studio\2017\Community\VC\Tools\MSVC\14.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 Studio\2017\Community\VC\Tools\MSVC\14.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 Studio\2017\Community\VC\Tools\MSVC\14.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 Studio\2017\Community\VC\Tools\MSVC\14.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 Studio\2017\Community\VC\Tools\MSVC\14.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 Studio\2017\Community\VC\Tools\MSVC\14.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 Studio\2017\Community\VC\Tools\MSVC\14.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 Studio\2017\Community\VC\Tools\MSVC\14.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 Studio\2017\Community\VC\Tools\MSVC\14.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 Studio\2017\Community\VC\Tools\MSVC\14.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 Studio\2017\Community\VC\Tools\MSVC\14.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 Studio\2017\Community\VC\Tools\MSVC\14.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 Studio\2017\Community\VC\Tools\MSVC\14.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 ++很陌生,有人可以告诉我如何告诉链接器它应该使用哪个Init(我知道.def文件有一个EXPORT语法,但是无法找到文档)或者我如何摆脱所有其他我不需要的东西。

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

?Init@@YGXXZ @1

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