高分求教,Qt如何加载调用win32程序qt交叉编译环境搭建的DLL

编译好的程序如何在其他电脑上运行呢 - QT开发当前位置:& &&&编译好的程序如何在其他电脑上运行呢编译好的程序如何在其他电脑上运行呢&&网友分享于:&&浏览:0次编译好的程序怎么在其他电脑上运行呢我编译好的程序,release版的,想打包后在另一个电脑上运行,但是这个电脑上没有装Qt,运行时就会报错,缺少dll。
怎么知道我这个exe文件都需要什么dll文件呢,是不是把需要的dll都打包进去就可以在另一个电脑上运行了?------解决思路----------------------创建一个文件夹&:&package,然后到Qt&的目录下,把plugins目录中的platforms文件夹和imageformats文件夹放到package中,然后打开Qt&的bin目录,将icudt51.dll、icuin51.dll、icuuc51.dll、Qt5Widgets.dll、Qt5Core.dll、Qt5Gui.dll&放到新建的package中,然后将你的&exe&文件放到&package中,如果程序中使用了图片资源什么的,也要加进去,这样就完全了。
这是Qt&5的打包,其中只有&platforms&文件夹和&imageformats&文件夹中的&dll&是运行时加载的,其他的依赖dll都可以使用depends工具检查出来,如果还不对,就使用这个工具检查一下吧------解决思路----------------------最简单的方式是用
windepolyqt&&your_application.exe------解决思路----------------------引用:Quote: 引用:
用depends工具查吧,一个一个的添加。如果是mac就方便很多,有一个deploy工具自动打包生成
使用depends查到很多个dll文件,能批量导出,或者复制吗?
一个一个复制到exe文件所在的文件夹好麻烦啊
depends&只是辅助,对Qt程序来说,depends找到的dll你都复制了还是不够的。你可能需要微软的&procexp.exe&这个东西来查看你的程序运行时到底需要哪些dll了。
如果要省事的话,就用Qt自带的&windepolyqt,它能帮你解决Qt的dll问题。如果你还用了其他的第三方的dll,你仍需要depends和&procexp来找出来(不过这部分一般都很简单了,一般自己程序用的第三方的dll可能不用找都知道)
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有通过两种方法模拟Qt如何调用外部dll文件中的功能函数
用圣才电子书APP或微信扫一扫,在手机上阅读本文,也可分享给你的朋友。
Qt 调用 DLL功能函数是本文要介绍的内容,DLL 是一个包含可由多个程序同时使用的代码和数据的库。不说这么多,先来看内容。
声明: 事先我已经自己动手写了一个简单的DLL文件(myDLL.dll),C版接口的。并且用我前两篇有关DLL文章里面的方法,从DLL中导出了导入库(.lib)文件,dll中有两个函数,原型如下:
1. void HelloWorld(); //函数内部调用Win32 API,功能是弹出一个helloworld提示框
2. int add(int a,int b); //实现两个数相加,并返回结果
下面分别通过显示调用和隐式调用两种方法,来模拟Qt如何调用外部dll文件中的功能函数,follow me....
预备知识:
1、如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,如果这三个文件都全的话,我们就可以使用简单方便的隐式调用。
2、通常Windows下程序显示调用dll的步骤分为三步(三个函数):LoadLibrary()、GetProcAdress()、FreeLibrary()
其中,LoadLibrary() 函数用来载入指定的dll文件,加载到调用程序的内存中(DLL没有自己的内存!)
GetProcAddress() 函数检索指定的动态链接库(DLL)中的输出库函数地址,以备调用
FreeLibrary() 释放dll所占空间
1、显示调用
Qt提供了一个 QLibrary 类供显示调用。下面给出一个完整的例子:
1. #include &QApplication&
2. #include &QLibrary&
3. #include &QDebug&
4. #include &QMessageBox&
5. #include &dll.h& //引入头文件
6. typedef int (*Fun)(int,int); //定义函数指针,以备调用
7. int main(int argc,char **argv)
9. QApplication app(argc,argv);
10. QLibrary mylib(&myDLL.dll&); //声明所用到的dll文件
12. if (mylib.load()) //判断是否正确加载
14. QMessageBox::information(NULL,&OK&,&DLL load is OK!&);
15. Fun open=(Fun)mylib.resolve(&add&); //援引 add() 函数
16. if (open) //是否成功连接上 add() 函数
18. QMessageBox::information(NULL,&OK&,&Link to Function is OK!&);
19. result=open(5,6); //这里函数指针调用dll中的 add() 函数
20. qDebug()&&
23. QMessageBox::information(NULL,&NO&,&Linke to Function is not OK!!!!&);
26. QMessageBox::information(NULL,&NO&,&DLL is not loaded!&);
27. return 0; //加载失败则退出
myDLL.dll为自定义的dll文件,将其复制到程序的输出目录下就可以调用。显然,显示调用代码书写量巨大,实在不方便。
2、隐式调用
这个时候我们需要三个文件,头文件(.h)、导入库文件(.lib)、动态链接库(.dll),具体步骤如下:
1、首先我们把 .h 与 .lib/.a 文件复制到程序当前目录下,然后再把dll文件复制到程序的输出目录,
2、下面我们在pro文件中,添加 .lib 文件的位置: LIBS+= -L D:/hitempt/api/ -l myDLL
-L 参数指定 .lib/.a 文件的位置
-l 参数指定导入库文件名(不要加扩展名)
另外,导入库文件的路径中,反斜杠用的是向右倾斜的
3、在程序中include头文件(我试验用的dll是用C写的,因此要用 extern &C& { #include &dll.h& } )
下面是隐式调用的实例代码:
1. #include &QApplication&
2. #include &QDebug&
3. extern &C& //由于是C版的dll文件,在C++中引入其头文件要加extern &C& {},注意
5. #include &dll.h&
7. int main(int argv ,char **argv)
9. QApplication app(argv,argv);
10. HelloWordl(); //调用Win32 API 弹出helloworld对话框
11. qDebug()&&add(5,6); // dll 中我自己写的一个加法函数
12. return 0; //完成使命后,直接退出,不让它进入事件循环
还是隐式调用方便啊,直接就可以调用dll中的函数.
小结:详解 Qt 调用 dll 功能函数的内容介绍完了,希望本文对你有所帮助,如果还需要相关资料的话,请参考编辑推荐!
&来源:网络
小编工资已与此赏挂钩!一赏一分钱!求打赏↓ ↓ ↓
如果你喜欢本文章,请赐赏:
已赐赏的人
我的电子书.NET、QT、面向对象、设计模式、超声成像、彩超技术、图像信号处理、数字图像处理、烧结专家系统、浮选泡沫分析、MES系统
由于Qt Creator使用的是mingW进行程序编译,该编译方式无法识别#pragma comment(lib,"lib\\hvdailt.lib")引用。 所以需要在.Pro文件中加入引用类库(如果事先使用vs2008等环境编译的程序,需要先为项目添加.Pro文件),然后再Qt Creator中打开.Pro项目文件,项目加载完毕后,打开.Pro文件填入库引用。 例子: # ----------------------------------------------------# This file is generated by the Qt Visual Studio Add-in.# ------------------------------------------------------TEMPLATE = appTARGET = BubbleAnalysisDESTDIR = ../Win32/DebugQT += core gui sqlCONFIG += debugDEFINES += QT_DLL QT_SQL_LIBINCLUDEPATH += ./GeneratedFiles \
./GeneratedFiles/DebugDEPENDPATH += .MOC_DIR += ./GeneratedFiles/debugOBJECTS_DIR += debugUI_DIR += ./GeneratedFilesRCC_DIR += ./GeneratedFiles###引入数字摄像机api####LIBS += -L$$PWD/lib –lHVDAILT
LIBS += -L$$PWD/lib -lraw2rgbLIBS += -L$$PWD/lib –lHVUtil###引入数字摄像机api####include(BubbleAnalysis.pri)&编译程序成功!
阅读(...) 评论()7082人阅读
USB开发(16)
转自:安祺智能技术()
今天在虚拟机上测试设备时,发现了VS2008编译的libusb0.dll对VC++&9 的&Runtime&库有依赖性。使用/MT选项编译的话,这个dll有100多K。显然不行。终于明白为什么libusb-win32使用gcc编 译这个dll了。
&&&&花了4个小时的时间,在资料几乎没有的情况下,搞明白了官方推荐的&MinGW/Msys&编译方法。在这里鄙视一下libusb- win32项目组,编译方法寥寥几行就说完了,简单也就罢了,结果还没有用。
&&&&所以下面的VS2008编译的方法就仅供大家参考吧。高手就不用了,新手的话,可能还能加深对编译的理解。
&&& libusb-win32项目组提供的编译方法说明
&&&&This&folder&contains&batch&files&to&compile&libusb-win32&with&Microsoft's&DDK.
&&&&Requirements:
&&&1)&Use&WinDDK&&for&Windows&2000&to&Windows&7&compatibility.
&&&(NOTE:&WinDDK&&is&that&last&to&support&Windows&2000)
How&to&compile:
1)&install&the&DDK
2)&open&a&DDK&build&environment,&either&a&&checked&&or&a&&free&&one
3)&launch&one&of&the&following&batch&files&to&compile&the&sources:
&&&&make_driver.bat:&builds&the&driver
&&&&make_dll.bat:&builds&the&DLL
&&&&make_install_filter.bat:&builds&install-filter.exe&utility
&&&&make_test.bat:&builds&the&command&line&version&of&the&test&tool
&&&&make_test_win.bat:&builds&the&Windows&version&of&the&test&tool
&&&&make_all.bat:&builds&everything,&driver,&DLL,&and&the&test&tools
---------------------------------------------------------------------------------------------------------------
&&& MinGW/Msys编译方法
&&&&同样的,这个也需要WINDDK。MinGW只是完成了VS2008的功能,编译的脚本libusb-win32的开发包里已经有了,我 们只要略加修改make.cfg文件就可以了,make.cfg中WINDDK路径的修改请参照下面的介绍的方法。
&&&&MinGW是一个很开放的WINDOWS下的编译器,你可以放心的把它应用在商业上,并且这个也是免费的,具体的参见MinGW的 License。MinGW可以像cygwin一样的安装方式——只要一个下载管理器就能下载,管理MinGW的软件包。
只要选择最小安装就可以了。为了方便日后使用,你也可以选择安装g++和gmake。这些只占用一百多兆的空间。
然后,再修改make.cfg中DLLTOOL的路径,我装在E盘,这是我的make.cfg的相关内容
;&Path&to&gcc&dlltool&tool&(http://www.mingw.org/)
;&(optional)
DLLTOOL=E:\MinGW\bin\dlltool.exe
编译方法。
使用命令提示符,进入到ddk_make文件夹中,输入make.cmd。这时会自动打印帮助文件,(可恶的libusb-win32项目组竟然 把帮助文件藏在这!)
&(原文件名:ddkmake.jpg)&
输入make.cmd&&arch=x86&进行编译。OK。。
&&&&//==================================================================================
&&&&最近STM32&的USB应用似乎很火,刚好我也有个项目涉及到USB驱动。因为之前一直用USBASP为AVR单片机下载程序,所以对 USBASP所用到USB通信库libusb-win32有个名字及出处的印象。终于,5天前天对她有了第一步的了解。USB我也是新手,刚接触几天而 以,但这两天用自己编译的驱动跟STM32通信上后,还是小有点成就感的。拿人家的手短,得了好处,自然要为她宣传鼓噪一番,本着开源共享的精神,厚着脸 皮班门弄斧开了这个帖。当然,还是那句话,不看广告,看疗效。到底好不好用,就由列位看官自行斟酌。
&&&&在此我还推荐一个调试libusb-win32很好的一个例程,那就是STM32的&Virtual_COM_Port&例程,用这个你 可以很快的上手libusb-win32的库。闲话少说,下面我们进入正题。
&&&&国际惯例,还是先介绍一下libusb-win32,下面是抄的别人的(纠正一下,现在libusb-win32也支持 WINDOWS&VISTA/WINDOWS&7了)。。。
&&&&//----------------------------------------------------------&
LibUSB-Win32是一个用于Windows操作系统(Win98SE、WinME、Win2k和WinXP)上的通用USB设备驱动程 序。该驱动程序允许使用者在不写任何一行核心驱动程序代码的情况下,可以访问Windows系统上的任意一个USB设备。该驱动程序具有以下特点:
l&&&&&&&&&能够与任意一个已安装的USB设备进行通信
l&&&&&&&&&可被用作自己开发的USB设备的驱动程序
l&&&&&&&&&支持批量和中断传输
l&&&&&&&&&支持USB规范中定义的所有标准设备请求
l&&&&&&&&&支持USB设备制造商的自定义请求
LibUsb-Win32是由http://libusb-win32.sourceforge.net发布的,遵守 GNU&Lesser&General&Public&License(LGPL)和GNU&General&Public&License(GPL)许 可协议。这些协议明确规定:允许LibUsb-Win32用于商业软件,而不只是开源软件。
通过使用七个函数,就可以与USB设备进行简单通信了,通信的主要流程可分为以下四步:
1)&&&&&&&调用usb_init函数,进行初始化。
2)&&&&&&&打开要进行通信的USB设备的句柄。首先依次调用usb_find_busses、usb_find_devices和 usb_get_busses这三个函数,获得已找到的USB总线序列;然后通过链表遍历所有的USB设备,根据已知的要打开USB设备的 ID(VID/PID),找到相应的USB设备;最后调用usb_open函数打开该USB设备(在这里假设总线上没有相同VID和PID的USB设备。 如果总线上存在着相同VID和PID的设备,还需要进行其他条件判断,比如设备名称,以保证是打开的是期望的USB设备)。
3)&&&&&&&与USB设备进行通信。使用usb_control_msg函数,向USB设备读取数据或写入数据。
4)&&&&&&&关闭USB设备。完成所有操作后,调用usb_close函数关闭已经打开的USB设备。
//----------------------------------------------------------&
&&&&再来介绍一下编译工具。
&&&&MSVC(KIT里带的工程文件是VS2008的,如果你使用VS2005或VC6的话,就要自建工程了,libusb-win32的工 程比较复杂,不推荐。我使用的是Visual&studio&2008&RTM&90天试用版的)
&&&&BCC(如果你装了Borland&C++&Builder的话,只要修改make.cfg,然后运行ddk_make文件夹下对应的批 处理文件就可以了,这里我就不介绍了)
&&&&&上面两个都是用来编译libusb-win32的动态链接库、相关工具和DEMO程序的。我们还需要WINDDK来编译驱动,即生成 libusb0.sys文件。从官方提供的make.cfg文件上来看,使用的是WINDDK&.0(WINDOW&XP及以上版 本)&WINDDK&(WINDOWS&2000及以下版本)。我只在MICROSOFT的官网上找到最新 的&WINDDK&.1,所以,我用的是这个。
&&&&有了VS2008和WINDDK,我们就可以开始下面的工作了。
&&&&下载源码
&&&&&你可以去官网上直接下载源码,地址是http://sourceforge.net/projects/libusb-win32 /files/
&&&&&也可以通过SVN工具从&https://libusb-win32.svn.sourceforge.net/svnroot /libusb-win32&libusb-win32&检出最新的源码,我使用的是SVN工具是TortoiseSVN。
&&&&&vs2008的项目文件位于projects文件夹中。我们来看一下
&(原文件名:libusb0.jpg)&
&&&&总共有7个项目。
&&&&inf-wizard——设备驱动安装信息文件生成向导。此向导可以扫描计算机上的USB设备,并可以获取你选择的设备的VID及PID 生成inf文件。
&(原文件名:inf1.jpg)&
&(原文件名:inf2.jpg)&
&&&&install-filter——filter驱动安装。filter&driver&是驱动的高层境界,杀毒软件,防火墙,笔记本的多 功能按键等等都会用到。
&&&&libusb-dll——动态链接库,生成libusb0.dll。上面说的“7个函数”就封装在这里面。同时生成了 libusb0.lib文件,供你的程序链接,这个文件实现了libusb0.dll的装载。
&&&&libusb-sys——USB驱动,生成驱动文件libusb0.sys。大家不要误以为是VC++编译的,其实是makefile项 目,WINDDK玩的借腹生子的把戏,借的VS的腹。
&&&&testbulk——libusb-win32的&”Hello,World!“。
&&&&testlibusb——顾名思义,实现了libusb-win32驱动的设备的遍历并打印一部分设备描述信息。
&&&&testlibusb-win——WINFORM版的testlibusb。
&&&&既然工程都建好了,先编译再说,报错了再查错找错。按&F7&编译怎个解决方案。
&&&&没有报错,但libusb-sys生成目录下也没有libusb0.sys文件。答案在这里,libusb-sys是靠WINDDK来编 译链接的。这有点像我用VS2005的IDE配合WINAVR来开发AVR单片机一样的了。
&&&&查看libusb-sys的项目属性页,在[配置属性]的[NMAKE]栏里,查看“生成命令行”。
CD&&$(ProjectDir)..\ddk_make&
CMD&/C&make.cmd&&arch=x86&&&app=driver&&&noclean=true&&&outdir=$(OutDir)&&&DIR_INTERMEDIATE=$(IntDir)&&&debugmode=true&
&&&&看来编译脚本是这个ddk_make文件夹下的make.cmd了。
&&&&在这里
&&&&SET&MAKE_CFG=!DIR_LIBUSB_DDK!make.cfg
&&&&查看这个make.cfg文件。
&&&&打包的那些我就不说了,我们看看关键的两个东西。
&&&&;&Default&WinDDK&directory(s)&Adjust&these&values&to&match&your&environment
&&&&;&(REQUIRED)
&&&&WINDDK_BASE=Z:\WinDDK
&&&&WINDDK_DIR=!WINDDK_BASE!\.0\
&&&&;&(optional)
&&&&WINDDK_W2K_DIR=!WINDDK_BASE!\\
&&&&呵呵,WINDDK放在这。在这里我想八卦一下。看他们把WINDDK放在Z盘,我猜他们是不也是用虚拟机大法无限制的使用90天试用版 的呢?呵呵,纯属猜测,如有雷同,实属巧合。
&&&把这两项改成你的WINDDK安装路径即可。比如我的是
&&&;&Default&WinDDK&directory(s)&Adjust&these&values&to&match&your&environment
&&&&;&(REQUIRED)
&&&&WINDDK_BASE=E:\WinDDK
&&&&WINDDK_DIR=!WINDDK_BASE!\.1\
&&&&;没找到WINDDK6,也暂时不打算编译WINDOWS2000及以下版本的驱动,所以就注释掉了
&&&&;&(optional)
&&&&;WINDDK_W2K_DIR=!WINDDK_BASE!\\
&&&&编译一下libusb-sys。error.h&和error.c&会报&warning&C4819,有个时候,编译器会把这个 warning当作error,使得不能成功编译,按编译器提示的方法,用VS2008重新保存一下这两个文件即可。OK。。
&&&&为Virtual_COM_Port安装我们的这个驱动吧。先用inf-wizard生成inf文件。分别复制libusb0.sys和 libusb0.dll至x86文件夹下。
&(原文件名:driverfile.jpg)&
&手动安装此驱动,这个就不用我多说了吧,大家都会。
&(原文件名:device.jpg)&
运行testlibusb-win测试下设备。报错!
&(原文件名:error.jpg)&
R6034错误,这个错误是因为没有将资源清单嵌入到libusb0.dll中。我们可以使用mt工具将资源清单嵌入到exe或dll中。因为 libusb-win32提供的工程文件默认配置是没有生成清单文件的,所以我们还要设置一下。
libusb-dll项目属性页-&链接器-&清单文件;把&[生成清单]&设为&“是”,重新生成libusb-dll
开始 -&Microsoft&Visual&Studio&2008-&Visual&Studio&Tools-&Visual&Studio&2008&x64&兼 容工具命令提示;
cd&入libusb-dll的生成目录
mt.exe&–manifest&libusb0.dll.manifest&-outputresource:libusb0.2
&(原文件名:cmd.jpg)&
[本文为 安祺智能技术() 原创]
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:860215次
积分:10634
积分:10634
排名:第1228名
原创:153篇
转载:472篇
译文:20篇
评论:80条
(6)(1)(3)(7)(1)(1)(1)(1)(9)(2)(5)(1)(3)(4)(3)(2)(2)(1)(1)(1)(11)(12)(4)(10)(6)(11)(3)(2)(13)(7)(13)(2)(33)(17)(8)(14)(22)(30)(7)(51)(6)(29)(47)(17)(20)(37)(6)(38)(73)(31)(7)(5)高分求教,Qt如何加载调用win32的DLL?一个为CChart,一个为CChartWnd;现在我已经把这三个文件放到了相关的下,并且在需要加载DLL的Qt类中添加了头文件:#include&"Chart.h"#pragma&comment(lib,"PlotDll.lib")现在我在Qt的这个类中定义CChartWnd&m_chartW但是编译出现错误,找不到构造函数和析构函数的定义,求教我该如何在Qt中定义这个对象,后续操作我需要用这个m_chartWnd去调用DLL中的函数,求指教!
Qt5&?Qt4.8&?1。去QT&creator里面把你的project属性中的选项改成vc的,如果没有,就去qt&creator的option中build&run中的tool&chains手动添加2。下载vs&addin,直接使用visual&studio&当ide引用:很可能装的是&QtSDK&1.2.1&吧,它自带编译器,不是VC的。可能是这个原因。LIBS&+=&-Lc:/testdir/lib&-lPlotDllINCLUDEPATH&+=&$$c:/testdir/includeDEPENDPATH&+=&$$c:/testdir/includec:/testdir/lib是你的lib的路径;c:/testdir/include是你的头文件的路径;具体路径可以根据工程的目录写相对路径,如LIBS&+=&-L$$PWD/lib&-lPlotDll就是你的工程目录下的lib文件夹,不知道对你有没有帮助LIBS&+=&-L&./&-lPlotDll然后将PlotDll.dll和PlotDll.lib拷贝到工程build目录下(就是含有Makefile的目录),再重新编译一次,应该就可以了。LIBS&+=&-Lc:/testdir/lib&-lPlotDllINCLUDEPATH&+=&$$c:/testdir/includeDEPENDPATH&+=&$$c:/testdir/includec:/testdir/lib是你的lib的路径;c:/testdir/include是你的……我的建议也是这样。g++/minGW不支持#pragma&comment()预编译指令。如果可以重编PlotDll,那就用你现在的编译器重编译一下。不行的话,你用一个可以和PlotDll编译的编译器封装成一个普通的dll,用静态编译,用导出去给新的编译器使用。这样也不是100%完美,因为有可能里面的汇编处理内存方式的不一样导致程序崩溃。两个不同编译器编出来的东西想混用有点难度。

我要回帖

更多关于 qt编译mysql驱动 的文章

 

随机推荐