20

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

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzUxMTk4MzY3MA%3D%3D&%3Bmid=2247484346&%3Bidx=1&%3Bsn=8f43d9d67bc97613fdcecc1c5e619d26
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

最近在封装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 调用。

效果如下:

aYbuaav.png!web

二、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 使用。

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

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

欢迎大家关注公众号:

MZzeIjR.png!web

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK