qt 制作动态库 (程序运行时)

本文详细介绍了一套完整的Qt程序编译与部署流程,包括如何准备必要的库文件、配置qt.conf文件、调整Makefile参数及指定正确的库路径等关键步骤。
编译步骤:

1.拷贝qt目录的文件夹

cp -d -R lib libexec phrasebooks plugins resources translations /home/mch/workspace/svnspace/test2/buildexec  拷贝这些文件到一个新目录

(删除不需要的cd lib;rm *.la *.prl;然后进入将lib目录下的文件都创建软链接到libexec目录:ls *.so*|xargs -I{} ln -s ../lib/{} ../libexec/{})
2.然后在当前buildexec/libexec目录下新建qt.conf文件,内容如下
[Paths]
Prefix=..
3.然后在当前buildexec目录下新建qt.conf文件,内容如下
[Paths]
Prefix=.

4.拷贝程序运行需要的文件到这个目录
5.将plugins/xcbglintegrations/ 目录下的两个文件拷贝到lib目录
6.执行qmake -o Makefile ../test.pro
7.修改Makefile.Release  LFLAGS  LIBS 的lib为当前路径;
LFLAGS        = -Wl,-O1 -Wl,-rpath,./lib -Wl,-rpath-link,./lib
LIBS          = $(SUBLIBS) -L/home/XXX/test/bin  -L./lib -lQt5WebEngineWidgets -lQt5WebEngine -lQt5WebEngineCore -lQt5QuickWidgets -lQt5Quick -lQt5PrintSupport -lQt5Widgets -lQt5Gui -lQt5WebChannel -lQt5Qml -lQt5Network -lQt5Positioning -lQt5Sql -lQt5Xml -lQt5Core -lQt5WebView -lpthread

8.
修改生成文件路径:
DESTDIR       = ./
TARGET        = ./test

9.执行make -f Makefile.Release


10. 程序与lib文件夹同一路径即可运行

<think> 我们参考了用户提供的4个引用,并从中提取与问题直接相关的信息: 引用[1]提到了需要确保安装Qt和VC++开发环境,但这不是打包部署的问题。 引用[2]提供了重要信息:在客户电脑上部署,出现了无法加载动态库的问题,通过安装VC++运行组件解决。同总结中提到:DLL本身的运行环境需要具备,例如.NET Framework等,需要安装VC++运行组件。 引用[3]指出:Qt的windeployqt.exe只能处理Qt相关的依赖,不能处理第三方依赖(如OpenCV)和VC++运行库,需要手动添加。 引用[4]则提到了链接设置中的库目录,但与我们打包VC++运行库关系不大。 因此,核心问题是如何在Qt打包将VC++运行动态库包含进去。根据引用[3],我们知道windeployqt.exe不会自动包含VC++运行库,所以需要手动添加。 以下是解决方案: 方法1:手动复制VC++运行库到打包目录,并在安装程序中将它们安装到目标机器。 方法2:使用安装程序制作工具(如Inno Setup、NSIS)在打包安装程序自动安装VC++运行库(即VC_redist.exe)。 由于用户询问的是“Qt打包如何加入VC++运行动态库”,我们重点介绍手动复制的方法,因为这是直接包含动态库的方式。同也会提到使用安装程序安装VC_redist.exe的方法。 步骤1:确定你的Qt程序使用的VC++版本和位数(例如,VS2015、VS2017、VS2019等,以及32位还是64位)。 步骤2:找到对应的VC++运行库的DLL文件。通常它们位于系统目录(如C:\Windows\System32)或Visual Studio的安装目录下的VC\Redist目录中。但是,更推荐的方式是使用对应的VC_redist.exe安装包,因为这样可以确保所有需要的DLL都包含在内,且版本正确。 步骤3:将所需的DLL复制到你的可执行文件目录中。需要哪些DLL?通常包括:vcruntimeXXX.dll,msvcpXXX.dll等(XXX为版本号)。但具体需要哪些文件,可以通过在开发机上运行依赖检查工具(如Dependency Walker)来确定,或者直接复制整个VC_redist安装包解压后的对应文件夹。 然而,更推荐的方法是使用安装程序来安装VC_redist.exe,这样更规范且避免遗漏。 推荐方法:使用安装程序制作工具(如Inno Setup)来打包你的Qt程序,并在安装过程中运行VC_redist安装程序。 具体步骤: 1. 编译你的Qt程序,并使用windeployqt.exe收集Qt依赖(这一步会收集所有Qt相关的DLL)。 2. 创建一个安装程序脚本(例如Inno Setup脚本)。 3. 在安装程序脚本中,添加一个步骤来检测目标机器是否安装了所需的VC++运行库,如果没有,则运行VC_redist.exe。 示例(Inno Setup脚本片段): ``` [Setup] ...其他设置... [Files] ; 包含你的程序文件和windeployqt收集的文件 Source: "C:\Path\To\Your\App\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs ; 包含VC_redist.exe(例如,将VC_redist.x64.exe放在你的安装程序目录中) Source: "VC_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall [Run] ; 运行VC_redist.exe安装(如果未安装) Filename: "{tmp}\VC_redist.x64.exe"; Parameters: "/install /quiet /norestart"; StatusMsg: "正在安装VC++运行库..."; Check: VCRedistNeedsInstall [Code] ; 检查是否已安装的函数 function VCRedistNeedsInstall: Boolean; var Version: String; begin Result := True; // 这里检查注册表中是否有对应的VC++运行库安装信息,例如对于VS2015-2022的x64版本,其注册表键值如下 if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', 'Version', Version) then begin // 如果版本号大于等于某个值,则不需要安装 // 注意:这里需要根据实际的VC_redist版本进行判断,例如版本号可能是14.30.30704.0 if CompareVersion(Version, '14.30.30704.0') >= 0 then Result := False; end; // 如果检查32位,则注册表路径为SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86 end; ``` 注意:上述注册表路径和版本号需要根据你的VC++运行库版本进行调整。对于VS2017和VS2019,注册表路径中的14.0可能会变成14.16或14.29等,具体需要查看对应版本的文档。 另外,也可以使用更通用的检查方法,例如检查是否存在特定的DLL文件,但使用注册表检查更标准。 替代方案:使用Qt自带的工具(如windeployqt)虽然不能包含VC++运行库,但我们可以通过修改Qt的部署工具配置来添加额外的库,但这比较复杂。所以我们推荐使用安装程序来包含VC_redist.exe。 总结: 1. 手动复制VC++运行库DLL到打包目录(不推荐,因为可能遗漏,且版本管理麻烦)。 2. 使用安装程序制作工具,在安装过程中安装VC_redist.exe(推荐)。 根据引用[2]和[3]的经验,在部署确保VC++运行库的存在是非常重要的,因此我们推荐第二种方法。 相关问题: 1. 如何确定我的Qt程序需要哪个版本的VC++运行库? 2. 如何获取对应版本的VC_redist.exe? 3. 除了VC++运行库,Qt程序部署还需要注意哪些第三方依赖? 4. 如何检测目标机器是否已经安装了特定版本的VC++运行库? </think> ### Qt打包加入VC++运行动态库的方法 根据引用内容,Qt的`windeployqt.exe`工具无法自动包含VC++运行库(引用[3]),需手动处理。以下是完整解决方案: --- #### **方法1:手动复制VC++运行库**(适合简单部署) 1. **确定编译器版本** - 检查Qt使用的VC++编译器版本(如MSVC 2015/2017/2019/2022) - 编译位数需一致(32位/64位)(引用[2]) 2. **定位并复制DLL文件** - 从以下目录复制VC++运行库(替换`<version>`为实际版本号): ```bash C:\Windows\System32\vcruntime<version>.dll C:\Windows\System32\msvcp<version>.dll # 例如:vcruntime140.dll, msvcp140.dll(VS2015+) ``` - 将上述DLL放入Qt可执行文件同级目录 3. **验证依赖关系** 使用工具(如[Dependency Walker](https://www.dependencywalker.com/))检查所有运行依赖。 --- #### **方法2:集成VC_redist安装包**(推荐专业部署) 通过安装程序自动部署(如Inno Setup): 1. **下载VC_redist安装包** - 从微软官网获取对应版本: - [VS2015-2022 Redist](https://aka.ms/vs/17/release/vc_redist.x64.exe) - 根据位数选择`x86`或`x64` 2. **在安装脚本中添加执行命令**(以Inno Setup为例) ```ini [Run] Filename: "{tmp}\vc_redist.x64.exe"; Parameters: "/install /quiet /norestart"; StatusMsg: "Installing VC++ Runtime..." ``` 3. **打包包含VC_redist.exe** ```ini [Files] Source: "path\to\vc_redist.x64.exe"; DestDir: "{tmp}" ``` --- #### **关键注意事项** 1. **环境一致性** - Qt编译器位数必须与VC++运行库一致(引用[2]) - 若使用OpenCV等第三方库,也需手动包含其DLL(引用[3]) 2. **路径设置** - 动态库路径需为绝对路径或相对于exe的路径(引用[2]) - 避免中文/特殊字符路径 3. **部署验证** - 在新机器(无VC++环境)测试运行 - 使用`Process Monitor`监控DLL加载情况 --- #### **故障排查** - **错误:"Cannot load library XXX.dll"** 检查是否遗漏`vcruntime140.dll`等核心库(引用[2]) - **错误:"0xc000007b"** 通常是32位/64位库混用导致(引用[2]) > **提示:** 对于.NET依赖项,还需确保目标机器安装对应.NET Framework版本(引用[2])。 --- ### 相关问题 1. 如何检查Qt程序所需的完整运行依赖(包括非VC++库)? 2. 使用`windeployqt.exe`打包,如何处理OpenCV等第三方库的依赖问题? 3. 如何为不同版本的Visual Studio编译器(如VS2015和VS2022)选择合适的VC++运行库? 4. 在Inno Setup脚本中如何实现VC_redist的静默安装和错误检测? 5. 除VC++运行库外,Qt程序部署到新机器还可能遇到哪些常见依赖问题?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值