我的非托管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/

10-11 22:45
查看更多