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