我的非托管c++类中具有以下函数调用:
_pUserApi = CThostFtdcMdApi::CreateFtdcMdApi();
编译器似乎正在生成此符号:
?CreateFtdcMdApi@CThostFtdcMdApi@@$$FSAPEAV1@PEBD_N1@Z
但是,当我在.lib文件上执行dumpbin链接时,看到以下符号:
?CreateFtdcMdApi@CThostFtdcMdApi@@SAPEAV1@PEBD_N1@Z
区别在于第一个中有一个额外的$$ F。
是否存在可以解释这种差异的编译器选项?...是否有某种形式的说明可以用来解密重整?
注意:这是一个x64 lib文件(我正在选择x64进行编译。
完全错误:
Error LNK2028 unresolved token (0A000021)
"public: static class CThostFtdcMdApi * __cdecl CThostFtdcMdApi::CreateFtdcMdApi(char const *,bool,bool)"
(?CreateFtdcMdApi@CThostFtdcMdApi@@$$FSAPEAV1@PEBD_N1@Z)
referenced in function "public: void __cdecl CTPMarketData::Start(char const *,char const *,char const *,char const *)"
(?Start@CTPMarketData@@$$FQEAAXPEBD000@Z)
CTPLib_cpp
完整转储:
61C __IMPORT_DESCRIPTOR_thostmduserapi
862 __NULL_IMPORT_DESCRIPTOR
9A0 thostmduserapi_NULL_THUNK_DATA
D94 ?CreateFtdcMdApi@CThostFtdcMdApi@@SAPEAV1@PEBD_N1@Z
D94 __imp_?CreateFtdcMdApi@CThostFtdcMdApi@@SAPEAV1@PEBD_N1@Z
E2C ?GetApiVersion@CThostFtdcMdApi@@SAPEBDXZ
E2C __imp_?GetApiVersion@CThostFtdcMdApi@@SAPEBDXZ
C0E ??1CThostFtdcMdApi@@IEAA@XZ
C0E __imp_??1CThostFtdcMdApi@@IEAA@XZ
B8E ??0CThostFtdcMdApi@@QEAA@XZ
B8E __imp_??0CThostFtdcMdApi@@QEAA@XZ
B08 ??0CThostFtdcMdApi@@QEAA@AEBV0@@Z
B08 __imp_??0CThostFtdcMdApi@@QEAA@AEBV0@@Z
C8E ??4CThostFtdcMdApi@@QEAAAEAV0@AEBV0@@Z
C8E __imp_??4CThostFtdcMdApi@@QEAAAEAV0@AEBV0@@Z
D18 __imp_??_7CThostFtdcMdApi@@6B@
Visual Studio生成的命令行:
d:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ HostX86 \ x86 \ CL.exe / c / AI“C:\ Program Files(x86)\引用程序集\ Microsoft \ Framework.NETFramework \ v4.6.1 \“/ AI” C:\ Program Files(x86)\ Windows Kits \ 10 \ References“/ AI” C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.6.1 \ Facades \“/ Zi / clr / nologo / W3 / WX-/诊断:经典/ Od / Oy-/ D WIN32 / D _DEBUG / D _WINDLL / D _UNICODE / D UNICODE / EHa / MDd / GS / fp:精确/ Zc:wchar_t / Zc:forScope / Zc:内联/Yu"stdafx.h"/Fp"Debug\CTPLib_cpp.pch"/Fo"Debug\"/Fd"Debug\vc141.pdb"/ TP / FU“C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.6.1 \ mscorlib.dll” / FU“C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.6.1 \ System.Data.dll“/ FU” C:\ Program Files(x86)\引用程序集\ Microsoft \ Framework.NETFramework \ v4.6.1 \ System.dll“/ FU” C:\ Program Files(x86 )\引用程序集es \ Microsoft \ Framework.NETFramework \ v4.6.1 \ System.Xml.dll“/分析-/ FC / errorReport:提示/ clr:nostdlib AssemblyInfo.cpp CTPMarketData.cpp CTPMarketDataWrapper.cpp CTPSpi.cpp
最佳答案
Microsoft编译器带有undname
实用程序:
使用$$ F:
C:\>undname ?CreateFtdcMdApi@CThostFtdcMdApi@@$$FSAPEAV1@PEBD_N1@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "?CreateFtdcMdApi@CThostFtdcMdApi@@$$FSAPEAV1@PEBD_N1@Z"
is :- "public: static class CThostFtdcMdApi * __ptr64 __cdecl CThostFtdcMdApi::CreateFtdcMdApi(char const * __ptr64,bool,bool)"
没有:
c:\>undname ?CreateFtdcMdApi@CThostFtdcMdApi@@SAPEAV1@PEBD_N1@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "?CreateFtdcMdApi@CThostFtdcMdApi@@SAPEAV1@PEBD_N1@Z"
is :- "public: static class CThostFtdcMdApi * __ptr64 __cdecl CThostFtdcMdApi::CreateFtdcMdApi(char const * __ptr64,bool,bool)"
不幸的是,
undname
将两者解码为相同的函数签名。需要进行更多挖掘...PS:GCC的等效工具是
c++filt
关于c++ - 解密Mangled C++名称$$ F,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50265309/