QT Creator用mingw编译的动态库怎样在VC上调用

ljhlwy2011 2015-01-01 09:21:14
手上有个动态库(dll)是在QT Creator用mingw编译的,该动态库带gui界面,怎么在VC上调用。
不带gui界面的动态库(用mingw编译的)是可以在VC上正常调用的,但是该dll带了gui后调用就失败了,我知道VC用MSVC的编译器,因此对于mingw编译的dll不能正常使用,通过事件查看器可以看到是因为调用这个dll时QtCored4.dll模块出错了。
在QT Creator下用qtwinmigrate,并借助MSVC编译器编译的带gui界面的dll是可以被VC调用的,但问题是那个dll是用mingw编译的,而且是第三方提供的,不知道有没有什么办法可以在VC(或VS)上调用?欢迎高手指点!
...全文
643 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
DrAbel 2017-09-12
  • 打赏
  • 举报
回复
你这个问题很明显啊。 首先确认,mingw32编译出来的dll格式和msvc编译出来的dll格式是否相等,可通用,可以通用,别的什么都不必顾忌。.a .lib都一样 第二个,也是重点,程序员经常犯得错误,你运行exe的时候,你链接的mingw32的dll没在路径里,运行器找不到mingw32的dll,所以报错。 你这个问题,很明显第二个嘛。
ljhlwy2011 2015-01-04
  • 打赏
  • 举报
回复
引用 7 楼 dext 的回复:
这个也正常,因为 Qt 有自己的 事件循环,所以 你要有导出函数 激发事件循环。
可不可以详细说说?QT Creator(用MSVC编译器)调用mingw编译的dll会出现QTCored4.dll模块错误,应该是模块冲突了,两种编译器的模块不兼容。
ljhlwy2011 2015-01-04
  • 打赏
  • 举报
回复
引用 13 楼 HeadmasterWang 的回复:
调用库的话,需要保证编译那个库的Qt版本和你现在使用的库版本是完全一致的——尽管这个不是动态库的硬性要求,但是Qt库很大很复杂——差一个minor版本都有可能crash掉 完全一致也包括了编译器的一致——不同编译器的库版本是不一样的 你现在有两个模块,一个用MSVC编译,链接(或者符号链接)了MSVC的Qt库,另一个用MinGW编译,链接了MinGW的Qt库,这不该冲撞么 要么搞来那个库的源码,MSVC编译一遍,要么把你现在的工程迁移到MinGW上——这两个是最快的办法,如果你不想花十天半个月解决这个问题
首先谢谢您的回复,我这个库是要在VS下调用的,我原本的打算是将mingw生成的dll用qtwinmigrate再封装成库(用MSVC编译器)以解决QT事件循环和VC不一样的问题,然后在VS上调用这个库,但是发现MSVC编译器的QT工程根本不能用mingw生成的dll(无源码)。
  • 打赏
  • 举报
回复
调用库的话,需要保证编译那个库的Qt版本和你现在使用的库版本是完全一致的——尽管这个不是动态库的硬性要求,但是Qt库很大很复杂——差一个minor版本都有可能crash掉 完全一致也包括了编译器的一致——不同编译器的库版本是不一样的 你现在有两个模块,一个用MSVC编译,链接(或者符号链接)了MSVC的Qt库,另一个用MinGW编译,链接了MinGW的Qt库,这不该冲撞么 要么搞来那个库的源码,MSVC编译一遍,要么把你现在的工程迁移到MinGW上——这两个是最快的办法,如果你不想花十天半个月解决这个问题
  • 打赏
  • 举报
回复
不好意思,没看完之前的回帖,当我没讲
  • 打赏
  • 举报
回复
引用 10 楼 ljhlwy2011 的回复:
[quote=引用 7 楼 dext 的回复:] 这个也正常,因为 Qt 有自己的 事件循环,所以 你要有导出函数 激发事件循环。
可不可以详细说说?QT Creator(用MSVC编译器)调用mingw编译的dll会出现QTCored4.dll模块错误,应该是模块冲突了,两种编译器的模块不兼容。[/quote] 咱不挑战自己了行不?C语言跨编译器是相对简单的,但是Qt是C++,C++导出符号是带名称修饰的 如下代码
class Dummy
{
public:
    Dummy();
    ~Dummy();
};
对应Dummy::Dummy(), MSVC修饰过的是??0Dummy@@QAE@XZ,而MinGW则是__ZN5DummyC1Ev 我很好奇你这是怎么链接过去的 MinGW和MSVC的库互相调用确实可以——但是有些麻烦。我记得MinGW网站上面有几篇文章关于这个,不过好像已经out dated了 想调用不同编译器的库,extern "C",把你需要的函数全都按C导出
ljhlwy2011 2015-01-03
  • 打赏
  • 举报
回复
有没有哪位朋友有好的建议?
dext 2015-01-02
  • 打赏
  • 举报
回复
这个也正常,因为 Qt 有自己的 事件循环,所以 你要有导出函数 激发事件循环。
ljhlwy2011 2015-01-02
  • 打赏
  • 举报
回复
引用 4 楼 dext 的回复:
能不能调用取决于 你的DLL 的导出格式。如果是 标准 C 就没有问题。如果不是的话,那你只能再用mingw封装成C的。
是标准C的对外接口,但是那个dll本身是带gui界面的,如果不带界面的话是可以调用的(已经试过),但一换带gui界面的就立马出错了。
ljhlwy2011 2015-01-02
  • 打赏
  • 举报
回复
引用 3 楼 feilinhe 的回复:
还没这样交叉弄过,我倒是想知道为什么你那个“动态库(dll)是在QT Creator用mingw编译”不能换成VC???
这个dll是之前的同事整的,里面据说很复杂,重写的话要不少时间,所以想看看有没有办法直接调用。
dext 2015-01-02
  • 打赏
  • 举报
回复
能不能调用取决于 你的DLL 的导出格式。如果是 标准 C 就没有问题。如果不是的话,那你只能再用mingw封装成C的。
ljhlwy2011 2015-01-02
  • 打赏
  • 举报
回复
引用 7 楼 dext 的回复:
这个也正常,因为 Qt 有自己的 事件循环,所以 你要有导出函数 激发事件循环。
在QT Creator下用qtwinmigrate是可以将带gui界面以及信号和槽的dll用在VS上的,但必须要用MSVC编译器;现在的问题是我必须要用那个dll(mingw编译的,无源码),我曾经在QT Creator重建一个工程,并在这个工程中调用这个dll,然后用MSVC编译器将这个工程也生成dll,但放在VS上调用也失败了,真的没有办法调用成功吗?
feilinhe 2015-01-01
  • 打赏
  • 举报
回复
还没这样交叉弄过,我倒是想知道为什么你那个“动态库(dll)是在QT Creator用mingw编译”不能换成VC???
ljhlwy2011 2015-01-01
  • 打赏
  • 举报
回复
首先感谢“soso101”的朋友,我看了那个帖子,但是在mingw生成的动态库里没有找到.dll.a的文件,只有.a文件,后来按照帖子上链接.a静态库的方法,运行时依然报同样的错误,图1是运行VS生产的exe时出错(exe要链接.a的库),图2是用事件查看器捕捉到的错误。不知道是不是因为这个dll带gui的原因,之前不带gui的库都可以正常调用,但是带gui的库涉及到QtCored4.dll就报错了。不知道哪位朋友还有其他办法。
蜗牛sf 2015-01-01
  • 打赏
  • 举报
回复
引用 楼主 ljhlwy2011 的回复:
手上有个动态库(dll)是在QT Creator用mingw编译的,该动态库带gui界面,怎么在VC上调用。 不带gui界面的动态库(用mingw编译的)是可以在VC上正常调用的,但是该dll带了gui后调用就失败了,我知道VC用MSVC的编译器,因此对于mingw编译的dll不能正常使用,通过事件查看器可以看到是因为调用这个dll时QtCored4.dll模块出错了。 在QT Creator下用qtwinmigrate,并借助MSVC编译器编译的带gui界面的dll是可以被VC调用的,但问题是那个dll是用mingw编译的,而且是第三方提供的,不知道有没有什么办法可以在VC(或VS)上调用?欢迎高手指点!
如何在vc中使用mingw编译出来的动态库和静态库 我之前在win7下用mingw编译过ffmpeg,可以在vc下直接调用,你看下这个博客的内容是否能解决你的问题
简介   MinGW是指只用自由软件来生成纯粹的Win32可执行文件的编译环 境,它是Minimalist GNU on Windows的略称。这里的“纯粹”是指「使用msvcrt.dll的应用程序」。无法使用MFC (Microsoft Foundation Classes微软基础类)。   注:msvcrt.dll(名称:Microsoft C Runtime Library)提供了printf,malloc,strcpy等C语言函数,并且为使用C/C++(Vc)编绎的程序提供了初始化(如获取命令行参数)以及退出等功能. 编辑本段概念   MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入的集合,允许你生成本地的Windows程序而不需要第三方C运行时。   MinGW,即 Minimalist GNU For Windows。它是一些头文件和端口的集合,该集合允许人们在没有第三方动态链接的情况下使用 GCC 产生 Windows32 程序。   在基本层,MinGW 是一组包含文件和端口,其功能是允许控制台模式的程序使用微软的标准C运行时间(MSVCRT.DLL),该在所有的 NT OS 上有效,在所有的 Windows 95 发行版以上的 Windows OS 有效,使用基本运行时间,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的 C 运行时间扩展。该功能是 Windows32 API 不具备的。下一个组成部分是 w32api 包,它是一组可以使用 Windows32 API 的包含文件和端口。与基本运行时间相结合,就可以有充分的权利既使用 CRT(C Runtime)又使用 Windows32 API 功能。 编辑本段mingw工具集合   实际上 MinGW 并不是一个 单纯的C/C++ 编译器,而是一套 GNU 工具集合。除开 GCC 以外,MinGW 还包含有一些其他的 GNU 程序开发工具 (比如 gawk bison 等等)。   开发 MinGW 是为了那些不喜欢工作在 Linux(FreeBSD) 操作系统而留在 Windows 的人提供一套符合 GNU 的 GNU 工作环境。   所以,使用 MinGW 我们就可以像在 Linux 下一样使用 GNU 程序开发工具。   GCC 就是 MinGW 的核心所在,GCC 是一套支持众多计算机程序语言的编译系统,而且在语言标准的实现上是最接近于标准的。并且 GCC 几乎可以移植到目前所有可用的计算机平台。(我的电脑上就还装有 DevKitPro,里面包含 GCC 的 ARM(for GBA/DS/GP32) 和 MIPS(for PSP) 版本。)   GCC 本身不像 VC 那样拥有IDE 界面(在 Windows 上也存在 Dev C++ 之类的支持 MinGW 编译器的 IDE)。源代码编辑你可以选用任何你喜欢的文本编辑器(据说微软的开发人员包括 VC 的开发都不用 VC 所带的 IDE 编辑器,而是选用 GNU 的 VIM 编辑器)。然后使用 make 等工具来进行软件项目的编译、链接、打包乃至发布。而像 cvs(svn) 源代码版本控制工具可以让世界上任何一个角落的人都可以参与到软件项目中来。   关于 MFC,微软基础类,这个随 VC++ 携带的一个源代码公开的开发包,和其他 Windows 程序开发包是一样的。如果有 VC++ 的授权,你完全可以使用 MFC 的源代码,也就是你使用 GCC 来编译 MFC 程序是完全可以的。   当然,GNU 下也很多 Windows 程序开发包,甚至有一些是支持跨平台使用的。不仅仅可以直接把源代码编译为 Windows 程序,也可以不经修改编译为其他操作系统的图形程序。   不过 GNU 下,最流行的图形界面开发是 GTK+与Qt。GTK+ 与Qt均提供跨平台支持。例如qt支持windows、linux、mac os x、windows CE、symbian、meego等操作系统平台,并且提供了Qt SDK(包含Qt creator集成开发环境)。Gtk也能很好的运行在 Windows 平台(比如 GIMP 和 Gaim)。   总体说来,使用 MinGW 就是 GNU。
1、安装qt sdk 我装的是qt 5.3 msvc版32位,内置了qt creator,直接用windows带的msvc编译器。 2.安装opencv 我装的是opencv2.4.9 for windows,解压到D盘根目录下了。 注意opencv for windows解压后就有个build文件夹,说明是用msvc编译编译好的,我们的qt用的是msvc编译器的话就可以直接导入链接和头文件了,不需要网上那些人所说的要搞minGW和cmake编译,如果你装的qtminGW版的就需要用cmake重新编译一遍opencv,相关教程一搜一大把。 3.在qt creator中建一个标准的控制台C++工程项目。 随便建哪种项目都是可以的,这里为了方便直接建立最简单的C++控制台项目。 4.配置opencv的环境变量(此步貌似可省,但是配个环境变量总是保险的) 在另一篇博客里讲过http://blog.csdn.net/u012234115/article/details/38612977 5.修改工程的pro文件。 要包含头文件目录和静态连接目录,在里面加入 INCLUDEPATH+=d:/opencv/build/include/opencv \ d:/opencv/build/include/opencv2 \ d:/opencv/build/include LIBS+=D:\opencv\build\x86\vc12\lib\opencv_ml249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_calib3d249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_contrib249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_core249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_features2d249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_flann249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_gpu249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_highgui249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_imgproc249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_legacy249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_objdetect249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_ts249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_video249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_nonfree249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_ocl249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_photo249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_stitching249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_superres249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_videostab249d.lib 以上加入的是debug版本的,如果要release版本的就把后面的d去掉。其中/和\这两种斜杠都可以表示路径,但是不同路径换行分隔必须用\,INCLUDEPATH和LIBS等都可以一次加多条或者一次加一条,注意格式 加完了注意要qmake一下。

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧