基于图莫斯的CAN UDS升级上位机-LabVIEW版本(十四):打包与安装应用程序

1. 引言

在LabVIEW开发中,我们经常会依赖第三方动态链接库(DLL)。例如,使用图莫斯USB2XXX库进行CAN通信,或使用自定义的HEX/S19解析库。这些DLL通常分布在不同的目录中,我们在开发时通过相对路径来调用它们。

然而,当我们将应用程序打包成EXE或安装程序时,经常遇到一个问题:DLL文件被复制到data目录后,原有的文件夹结构丢失,导致程序运行时找不到DLL

本文将介绍一种稳健的解决方案

  1. 将所有依赖的DLL统一整合到一个Libs目录下。

  2. 修改LabVIEW代码,使用动态路径加载DLL(利用"应用程序目录"函数)。

  3. 正确配置应用程序生成和安装程序,确保目录结构在打包后保持一致。

通过这种方法,你的上位机可以在开发环境和打包环境下都能正常运行,无需再为路径问题烦恼。


2. 问题场景回顾

假设你的项目目录结构如下:

复制代码
项目根目录/
├── Main.vi
├── 图莫斯DLL-X86/
│   ├── USB2XXX.dll
│   └── 其他DLL
└── HexS19解析+CRC32计算DLL-X86/
    ├── HexParser.dll
    └── CRC32.dll

在开发时,你的LabVIEW程序通过相对路径调用DLL,例如在CLN节点中设置库路径为:

  • "图莫斯DLL-X86\USB2XXX.dll"

  • "HexS19解析+CRC32计算DLL-X86\HexParser.dll"

当使用Application Builder生成EXE时,默认会将所有"始终包括"的文件复制到data目录下,但不保留子文件夹结构 。所有DLL被平铺在data根目录,导致程序找不到原来的路径。


3. 解决方案:统一Libs目录 + 动态路径

我们采用以下策略:

  • 将所有DLL集中到一个Libs目录(比如Libs)。

  • 修改代码,使用**"应用程序目录"** 函数动态获取EXE所在路径,再拼接Libs\xxx.dll

  • 打包时,将Libs目录完整地添加到项目中,并确保在EXE生成和安装程序中保持目录结构。

这样,无论DLL被复制到data还是EXE同目录,只要相对路径正确,程序都能找到。


4. 第一步:整合DLL到统一的Libs目录

  1. 在项目根目录下新建一个文件夹,命名为Libs(或你喜欢的名字)。

  2. 将两个旧目录中的所有DLL文件复制Libs文件夹中,不保留原来的子文件夹(也可以保留,但为了简化,我们扁平化处理)。

新目录结构

复制代码
项目根目录/
├── Main.vi
├── Libs/
│   ├── USB2XXX.dll
│   ├── 其他图莫斯DLL...
│   ├── HexParser.dll
│   └── CRC32.dll
└── 其他文件...

注意:如果两个目录中有同名DLL,需要谨慎处理。一般情况下,不同功能的DLL不会重名。


5. 第二步:修改LabVIEW代码中的DLL加载路径

5.1 使用"应用程序目录"动态构建路径

在LabVIEW中,有一个非常有用的函数:"应用程序目录" (位于编程 → 文件I/O → 应用程序目录)。它返回当前运行的EXE(或VI)所在的目录路径。利用它,我们可以动态构建DLL的绝对路径。

示例 :假设你的DLL位于EXE所在目录下的Libs\USB2XXX.dll,那么路径构建如下:

  1. 获取应用程序目录 → 得到路径(例如C:\MyApp\)。

  2. 使用**"组合路径"** 函数,将应用程序目录与Libs\USB2XXX.dll拼接。

  3. 将拼接后的完整路径作为CLN节点的"库路径"输入(需要勾选CLN的"在程序框图中指定路径"选项)。

5.2 修改所有调用DLL的CLN节点

在每个调用DLL的CLN节点上:

  1. 右键点击CLN节点,选择**"在程序框图中指定路径"**(或"Specify path on diagram")。

  2. 这样CLN节点会出现一个path输入接线端。

  3. 将上一步构建的路径连接到这个path输入端。

LabVIEW代码段示意

5.3 对于通过字符串动态加载的DLL(如调用LoadLibrary

如果你的程序使用调用库函数节点的"动态加载"方式,也可以按照上述方法构建完整路径后传入。

修改所有相关的地方,确保所有DLL的调用都使用动态路径。

5.4 测试开发环境下的运行

在修改完成后,先在开发环境下运行,确保程序能正常加载所有DLL。由于我们使用了应用程序目录,它在开发环境下会返回当前VI的目录,因此路径也是正确的。


6. 第三步:配置应用程序生成(EXE)

6.1 将Libs目录添加到LabVIEW项目

项目浏览器中:

  1. 右键点击"我的电脑" → "添加" → "文件夹(快照)"。

  2. 选择项目根目录下的Libs文件夹,将其添加到项目中。

6.2 在EXE生成规范中包含Libs目录

  1. 在项目浏览器中,右键"程序生成规范" → "新建" → "应用程序 (EXE)"。

  2. 在配置对话框中,切换到**"源文件"**选项卡。

  3. 在左侧"项目文件"视图中,找到刚刚添加的Libs文件夹。

  4. 选中它,点击中间的蓝色箭头(添加到右侧的"始终包括"列表)。

  5. 这样Libs文件夹及其所有内容将被包含在生成的EXE目录中。

6.3 配置后生成EXE

完成上述设置后,点击"生成"按钮,生成EXE文件。查看生成目录,应该可以看到Libs\目录及所有DLL文件。


7. 第四步:配置安装程序(Installer)

7.1 新建安装程序生成规范

在项目浏览器中,右键"程序生成规范" → "新建" → "安装程序"。

7.2 添加源文件

切换到**"源文件"**选项卡:

  • 左侧"项目文件"视图中,展开"我的电脑",找到你的EXE生成规范(例如"我的应用程序")。

  • 展开它,确认Libs文件夹是否在列表中。如果没有,从左侧将Libs文件夹拖到右侧目标视图中,确保它位于Libs下(或者你想要的位置)。

7.3 配置附加安装程序

切换到**"附加安装程序"** 选项卡,务必勾选**"LabVIEW运行引擎"**以及其他必要的驱动(如VISA、DAQmx等)。

7.4 生成安装程序

点击"生成",生成setup.exe安装包。


8. 第五步:验证与测试

  1. 在客户机上安装生成的安装程序。

  2. 检查安装目录结构,确认Libs\存在且包含所有DLL。

  3. 运行应用程序,测试所有功能,确保DLL加载正常。


9. 注意事项与常见问题

问题 解决方案
开发环境能运行,但EXE运行时报错找不到DLL 检查打包后的目录结构,确保Libs文件夹存在;检查代码中路径拼接是否正确(应用程序目录 + "Libs\xxx.dll")。
多个DLL同名 应避免同名,或将它们放在不同的子文件夹中(如Libs\USB\Libs\Parser\),并在路径中区分。
DLL依赖其他DLL 确保所有依赖的DLL都在Libs目录中,并一起打包。
位数不匹配 确保DLL位数与LabVIEW位数一致(32位LabVIEW需32位DLL)。
路径包含空格或中文 尽量使用英文路径,避免编码问题。

10. 总结

通过将DLL统一到Libs目录,并使用"应用程序目录"动态构建路径,我们彻底解决了LabVIEW打包后DLL路径失效的问题。这种方法具有以下优点:

  • 开发/打包环境统一:代码不用修改,只需在打包时正确配置文件夹结构。

  • 易于维护 :所有DLL集中管理,添加新DLL只需复制到Libs并更新代码。

  • 移植性强:即使将来改变目录结构,只需修改路径拼接部分。

相关推荐
fanchenxinok1 天前
基于图莫斯的CAN UDS升级上位机-LabVIEW版本(十):TOOMOSS_SID31_RoutineControl.vi — 例程控制
can·labview·uds升级·升级上位机·uds刷写
kingwebo'sZone2 天前
我写的第一个labview 展示页面程序
labview
电气_空空2 天前
基于 LabVIEW的数据采集与信号处理系统的设计
嵌入式硬件·毕业设计·信号处理·labview
无垠的广袤2 天前
【RA-Eco-RA4M2开发板】步进电机的串口控制和 LabVIEW 数据采集
单片机·嵌入式硬件·labview
fanchenxinok3 天前
基于图莫斯的CAN UDS升级上位机-LabVIEW版本(八):TOOMOSS_SID85_ControlDTCSetting.vi — DTC控制
can·labview·uds刷写·图莫斯
fanchenxinok3 天前
基于图莫斯的CAN UDS升级上位机-LabVIEW版本(十一):LogManager.vi — 日志管理
can·labview·uds刷写·图莫斯
fanchenxinok3 天前
基于图莫斯的CAN UDS升级上位机-LabVIEW版本(九):TOOMOSS_SID2E_WriteDataByID.vi — 写入数据
can·labview·uds刷写
fanchenxinok3 天前
基于图莫斯的CAN UDS升级上位机-LabVIEW版本:从零搭建ECU刷写工具
labview·uds升级·升级上位机
fanchenxinok3 天前
基于图莫斯的CAN UDS升级上位机-LabVIEW版本(一):TOOMOSS_OpenDev(CAN).vi — 设备打开与句柄管理
labview