内容简介:点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,可以点个在看,让它可以帮助到更多同志最近在封装SDK,想做一个一、Qt MinGW调用
点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,可以点个在看,让它可以帮助到更多同志
最近在封装SDK,想做一个 Windows 下通用的,比如给出的动态库可以被 Qt MinGW 版本使用、也可以被 Qt MSVC 版本使用;还可以被 VS 使用。 Ok, 需求目标有了,接下来就是论证是否可以实现以及如何实现了。
一、Qt MinGW调用 VS 编译的 C 库
之前和大家分享过Qt使用海康相机 SDK 显示图片的例子,在该例子中使用了海康的 C 动态库, Qt 使用起来完全没有问题。
我的最终目标就是编一个和海康一样的动态库,可以被Windows下大多编译器识别调用即可。
目前的情况是SDK内部本身使用了第三方库,该库有源码、同时也提供了基于 VC14 的动态库,但是由于使用的 Qt 是 MinGW 版的,所以无法直接使用该库。为了先出第一版的 SDK ,选择了直接将第三方库使用 MinGW 进行编译,也就是只能供 Qt 调用。经过测试之后,使用 Qt5.5.1 编译的动态库,可以被 Qt5.14 使用 ( 具体对应的编译器分别是 mingw492_32 和 mingw73_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_int ; C 编译器产生的内部标识符是这样的, _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 使用。
之所以这么迫不及待地发出来,是因为网上的资料实在不多。
每日鸡汤:“知识就是金钱,冲鸭!”
欢迎大家关注公众号:
点一个在看是对我莫大的支持!感谢!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Linux内核编译及添加系统调用
- Android NDK秘籍--编译静态库、调用静态库
- 为 GlusterFS 设计新的xlator (编译及调用过程分析)
- Android——反编译某互联网金融APP,通过JS漏洞获取用户信息、调用分享接口植入钓鱼网站(安全篇)
- 直观讲解-RPC调用和HTTP调用的区别
- 调用链系列一:解读UAVStack中的调用链技术
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
疯狂Java讲义
李刚 / 电子工业出版社 / 2014-7-1 / 109.00元
《疯狂Java讲义(第3版)(含CD光盘1张)》是《疯狂Java讲义》的第3版,第3版保持了前两版系统、全面、讲解浅显、细致的特性,全面新增介绍了Java 8的新特性,《疯狂Java讲义(第3版)(含CD光盘1张)》大部分示例程序都采用Lambda表达式、流式API进行了改写,因此务必使用Java 8的JDK来编译、运行。 《疯狂Java讲义(第3版)(含CD光盘1张)》深入介绍了Java编......一起来看看 《疯狂Java讲义》 这本书的介绍吧!