我使用下载包中提供的Visual Studio解决方案从源代码构建了Xerces-c_3_1.dll。它适用于作为该软件包一部分的示例应用程序(只要它们是用VS构建的)。
但我需要将DLL与在C ++ Builder 10 Seattle中开发的应用程序一起使用。不兼容的链接和COFF-vs-OMF格式问题(导入lib)意味着我需要调整构建指令。我相信我需要将项目属性中的调用约定从__cdecl更改为__stdcall,并添加一个DEF文件来翻译我的环境的导出函数。
(我相信这是因为我编写并支持程序员用多种语言编写的DLL。我在C ++ Builder中进行开发[熟悉环境],并在VS Express 2015中创建发布版本[大量性能]对Embarcadero的改进,我很抱歉地说。。为32位版本添加了一个DEF文件[VC ++ 64位不需要,只是为了让我疯了],它适用于所有人。)
在 my DLL上运行TDUMP.exe会得到如下输出:
EXPORT ord:0060='Edit_RunEdits'
在使用__cdecl构建的Xerces-c_3_1.dll上运行 tdump -ee xerces-c_3_1.dll> tdump.txt 得到如下输出:
EXPORT ord:1763='?Initialize@XMLPlatformUtils@xercesc_3_1@@SAXKKKQBD0QAVPanicHandler@2@QAVMemoryManager@2@@Z'
EXPORT ord:1764='?Initialize@XMLPlatformUtils@xercesc_3_1@@SAXQBD0QAVPanicHandler@2@QAVMemoryManager@2@@Z'
在__cdecl版本上运行 impdef def.txt xerces-c_3_1.dll 得到如下输出:
?Initialize@XMLPlatformUtils@xercesc_3_1@@SAXKKKQBD0QAVPanicHandler@2@QAVMemoryManager@2@@Z @1763; ?Initialize@XMLPlatformUtils@xercesc_3_1@@SAXKKKQBD0QAVPanicHandler@2@QAVMemoryManager@2@@Z
在__stdcall构建上重复TDUMP和IMPDEF会得到类似的结果。
这是预期的。
但是如何从这种噪音中创建DEF文件呢? 我会非常满意使用格式的示例来转换"初始化@ XMLPlatformUtils"链接器可以匹配到" XMLPlatformUtils :: Initialize()"在我的客户端应用程序中。
顺便说一句,我还在两个版本(__cdecl和__stdcall)上使用了IMPLIB来创建一个导入库,我将其添加到我的测试项目中,但链接器继续发出"未解析的外部"我调用XMLPlatformUtils :: Initialize和XMLPlatformUtils :: Terminate的错误。我相信 应该是因为名称错误而预料到的。