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

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

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

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

 

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

欢迎大家关注公众号:

    

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

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
mingwqt是一种开发工具集,用于使用mingw编译的C++代码开发跨平台的应用程序。而vc是指微软的Visual C++,是另一种C++编译器。 要使用mingwqt调用vc动态库,需要满足以下条件: 1. 确保vc动态库是与mingw兼容的。由于mingw使用了自己独特的标准和ABI(Application Binary Interface),所以vc动态库也需要使用兼容的标准和ABI。否则,在调用vc动态库时可能会出现兼容性问题。 2. 在qt项目中添加vc动态库的引用。在.pro文件中使用LIBS关键字,指定需要链接的动态库文件。例如,LIBS += -L/path/to/vc-lib -lvc_lib。其中,/path/to/vc-lib是vc动态库所在的路径,vc_lib动态库的名称。这样,qt编译器会从指定路径下链接vc动态库。 3. 设置vc动态库的搜索路径。如果vc动态库不在默认的系统路径中,需要将其所在路径添加到系统搜索路径中。可以通过设置PATH环境变量实现,或是在程序中使用QCoreApplication::addLibraryPath()函数指定搜索路径。 4. 在代码中正确调用vc动态库的函数。首先,需要包含vc动态库的头文件,并正确使用其所提供的函数。其次,需要确保传递给vc动态库的参数类型和数量与其期望的相匹配。否则,在运行时可能会出现链接错误或崩溃。 需要注意的是,因为mingw和vc使用不同编译器和标准,所以在混合使用mingwqt和vc动态库时,需要格外小心兼容性问题。最好使用相同的编译器或工具集进行整个项目的开发,以避免潜在的兼容性和链接问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值