mingw如何链接vs方式编译生成的动态库?

貌似vs用的调用方式是stdcall,而mingw使用的调用方式是cdecl,我这里只有vs方式编译生成的动态库(没有源码),用mingw链接时提示f…
关注者
30
被浏览
27,449

4 个回答

两个编译器的c++ abi不兼容的,所以无法识别对方导出的符号完成链接。

但是可以用c语言中转,c的abi在所有编译器中都是相同的。

简单来说,把vc动态库所有导出接口都改为extern "C"形式即可,这样生成的动态库,MinGW是可以正确链接使用的,反之亦然。

但注意要规避一个问题,不要跨越动态库边界分配/释放内存,因为两边用的并不是同一套malloc/free。

并且发布程序时,两边的依赖都要带齐,比如vc库依赖的msvcrt等,mingw程序依赖的libpthread等。


关于c++对象,可以为其定义由纯虚函数组成的接口类,用c接口构造并返回接口指针,通过接口指针调用方法,这样的操作是没问题的。

不过虚接口的方式,其实是依赖了编译器的虚表结构,并没有在语言层面保证一定可用,最保险的方式,还是参考windows api的handle和linux api的fd。

即把ptr->function()改造为纯c的function(ptr)形式,这样还避免了虚函数的间接调用开销。

而需要运行时多态的虚函数,可以改为在ptr中显示保存函数指针来模拟虚表。

其实,各类大型c框架中的面向对象,就是这么实现的。

谢邀。

既然是动态库,也就是dll,那么mingw是可以链接的。

如果你确定dll里面的函数是 stdcall 调用方式,而不是 cdecl ,那么需要使用 pexports 工具生成一下模块定义文件(标准def文件)。

pexports.exe -v xxx.dll > xxx.def

然后使用mingw自带的 dlltool 工具,利用上一步生成 def 文件来创建 .a 文件。

dlltool --dllname xxx.dll --def xxx.def --output-lib libxxx.dll.a 

现在你可以通过 libxxx.dll.a 文件来做链接了。

如果你的dll里面的函数是 cdecl 方式调用的,那么就直接链接到 dll 文件就是。