创建MSVC库的完整DEF文件

时间:2014-11-13 10:34:33

标签: c++ visual-c++ dll mingw

我有以下问题。我想使用一个用VC6编译的库和mingw。有头文件,DLL文件和lib文件,所以它不应该是一个问题(至少是一个想法)。问题是我尝试过的每一个工具(dumpbin,pexports,reimp,gendef)都不会在需要的函数名之后创建'@n'。

是的,我可以手动添加,但不仅仅有一手功能。

也许你们其中一个人有个主意。

1 个答案:

答案 0 :(得分:0)

您遇到的问题是"缺点之一"共享库的交叉编译器使用@n是所谓的名称修改的一部分,其中符号以特殊方式从共享库中导出,以便链接器在构建另一个项目时可以引用它们。 / p>

问题是:名称修改不是流线型的,因此每个编译器都会自己进行修改(Microsoft VC ++和GCC),它们完全不同。

名称修改将导出函数的签名编码到symobl的名称中 - 即所有这些@?符号到位的地方。使用例如创建.def文件时dumpbin是一个Microsoft工具,它将为Microsoft mangling格式创建符号。 MinGW GCC对GCC使用修改,在链接时看起来符号不同。

如您所建议的那样,您可以选择在创建的.def文件中手动更正这些符号,但除非自动化,否则这非常麻烦且无效。更糟糕的是,Microsoft名称修改是专有的,虽然有些人已经花了很大力气来分析修改方案,但是很可能没有一种工具可以将Microsoft符号转换为GCC兼容符号(至少我不知道这样的工具)。

另一种方法是,在这种情况下,将符号导出为extern "C"非常常见,您之前可能已经看过了。它基本上消除了重整并输出符号'按原样#39;只有函数的名称。但这要求您可以访问MSVC6库的源代码,我认为这些库没有。

如果你真的需要使用这个库,你也可以自己编写一个包装器,创建一个导入lib的MSVC库,为每个符号提供一个函数,然后将它们导出为export "C"本身。但是在处理课程时这可能非常棘手,所以我不推荐它。

所以你在这里有五个选择:

1)如果您有源,请使用MinGW重新编译。这是最好和最干净的方法。

2)找到一个将MSVC符号名称转换为GCC名称的工具(我不知道是否存在任何名称)。

3)手动更改.def文件中的符号名称以符合您的GCC修改。如果你的所有功能最后只需要@n,我建议你编写一个小程序,如果其他选项都不适合你,你会自动执行此操作。

4)重新编译代码以将符号导出为extern "C"

5)用MSVC编写一个包装所有符号的库,并将它们导出为extern "C"本身。