Qt MinGW调用VS编译的动态库(一)

点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,可以点个在看,让它可以帮助到更多同志

最近在封装SDK,想做一个 Windows 下通用的,比如给出的动态库可以被 Qt MinGW 版本使用、也可以被 Qt MSVC 版本使用;还可以被 VS 使用。 Ok, 需求目标有了,接下来就是论证是否可以实现以及如何实现了。

一、Qt MinGW调用 VS 编译的 C

之前和大家分享过Qt使用海康相机 SDK 显示图片的例子,在该例子中使用了海康的 C 动态库, Qt 使用起来完全没有问题。

我的最终目标就是编一个和海康一样的动态库,可以被Windows下大多编译器识别调用即可。

目前的情况是SDK内部本身使用了第三方库,该库有源码、同时也提供了基于 VC14 的动态库,但是由于使用的 QtMinGW 版的,所以无法直接使用该库。为了先出第一版的 SDK ,选择了直接将第三方库使用 MinGW 进行编译,也就是只能供 Qt 调用。经过测试之后,使用 Qt5.5.1 编译的动态库,可以被 Qt5.14 使用 ( 具体对应的编译器分别是 mingw492_32mingw73_32)

接下来验证VS2013编译的动态库如何被 Qt MinGW 愉快的调用。

经过艰难困苦的测试, VS 编译的 C 动态库,可以被 Qt 链接, VS 导出库的头文件时应加上 extern C ;而且 Qt 对链接 VS 编译库的方式也有要求。

链接海康相机完全没问题

LIBS  += $$PWD/3rdLib/mvs/win32/lib/MvCameraControl.lib

链接VS编译的C库要这样写:

LIBS  += -L$$PWD/Lib/test/win32/lib/ -lTestlib

但是使用VS编译导出的 C++ 动态库确实不行的。这里先简单说下 extern “ C 的作用:在 C++ 调用 C 代码时会使用这个语法,而 C 代码中本身是没有这个命令的;该命令告诉编译器通过 C 的内部标识符去寻找对应函数,为什么这样?通过一个简单例子来说明下:

add(int x, int y)

对于上述这样的函数,由于C++具有重载功能,经过编译器编译后内部标识符类似这种, add_int_intC 编译器产生的内部标识符是这样的, _add

这样C++程序就可以直接调用 C 程序了。

话说回来,目前得出的结论是VS编译的 C 库可以愉快的被 Qt MinGW 调用。

效果如下:

二、Qt MinGW调用 VS 编译 C++ 生成的 C

前面说的是Qt直接调用 VS 编译的 C 库,这次做的测试是 VS 调用 Opencv 的库,然后再将其封装 C 库,测试 Qt MinGW 能否调用,这里可以确定的是可以调用。

吐槽一下,VS在链接 opencv 几十个库时,需要挨个写一遍,太难了。 ( 当然也可能是我的方法不对。)

以后有机会写下VS怎么编译和链接动态库。

三、小结

之所以这么迫不及待的发出来,是因为在网上找到可用的资料比较少。

Qt可直接调用 VS 编译出的 C 库:

VS 导出函数时需使用 extern C

②注意链接 C 库的形式

Qt无法直接调用第三方使用 VC 的编译的 C++ 动态库,但是可以通过 VS 中转成 C 库供 Qt MinGW 使用。

之所以这么迫不及待地发出来,是因为网上的资料实在不多。

每日鸡汤:“知识就是金钱,冲鸭!”

欢迎大家关注公众号:

点一个在看是对我莫大的支持!感谢!