这可能不是第一次出现这样的问题,但是......我知道有一些工具用于从 .dll (.def 生成器)中获取导出的函数,但是(对我来说)因为编译器的名称格式错误而没有用处生成函数不同。 有什么办法(可能是 .def 文件中的一些额外选项)告诉 mingw 编译器:_ZN6IDcDrv6CreateEPKci(MingW 的重命名格式)= ?Create@IDcDrv@@SAPAVDcDrv@@PBDH@Z(MSVC 的重命名格式)????(重定向 lib.a 对 dll 的引用)我说的是封闭源代码的 dll,所以我不能为 mingw 编译 dll ......或开源库,它的构建需要花费大量时间和/或耐心。
问问题
1224 次
2 回答
1
不,MSVC 名称修改是专有的且未记录在案。
即使您可以使名称在编译器之间保持一致,但仍有大量其他小差异会使您的链接代码在各种奇怪的地方(类布局、函数调用等)崩溃。
如果您需要互操作性,请编写一个 C 接口。32 位 MinGW(-w64) GCC 甚至可以链接到 32 位 MSVC C 库,反之亦然(如果您包含必要的编译器库,如 libgcc 或 MSVC 默认添加到其代码生成中的安全检查 cookie 库)。
于 2013-05-11T10:33:20.577 回答
0
是的,有一种方法:
使用https://www.agner.org/optimize中的 objconv到
- 重命名导出的函数。
- 转换对象格式。
- ...
如果您正确执行此操作,您将获得链接。
确保这件事
- 调用约定
- 对象结构匹配
我没有用 c++ 试过这个,但谁知道呢?
于 2018-08-26T13:02:52.960 回答