1. 引言
在LabVIEW开发中,我们经常会依赖第三方动态链接库(DLL)。例如,使用图莫斯USB2XXX库进行CAN通信,或使用自定义的HEX/S19解析库。这些DLL通常分布在不同的目录中,我们在开发时通过相对路径来调用它们。
然而,当我们将应用程序打包成EXE或安装程序时,经常遇到一个问题:DLL文件被复制到data目录后,原有的文件夹结构丢失,导致程序运行时找不到DLL。
本文将介绍一种稳健的解决方案:
-
将所有依赖的DLL统一整合到一个
Libs目录下。 -
修改LabVIEW代码,使用动态路径加载DLL(利用"应用程序目录"函数)。
-
正确配置应用程序生成和安装程序,确保目录结构在打包后保持一致。
通过这种方法,你的上位机可以在开发环境和打包环境下都能正常运行,无需再为路径问题烦恼。
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目录
-
在项目根目录下新建一个文件夹,命名为
Libs(或你喜欢的名字)。 -
将两个旧目录中的所有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,那么路径构建如下:
-
获取应用程序目录 → 得到路径(例如
C:\MyApp\)。 -
使用**"组合路径"** 函数,将应用程序目录与
Libs\USB2XXX.dll拼接。 -
将拼接后的完整路径作为CLN节点的"库路径"输入(需要勾选CLN的"在程序框图中指定路径"选项)。
5.2 修改所有调用DLL的CLN节点
在每个调用DLL的CLN节点上:
-
右键点击CLN节点,选择**"在程序框图中指定路径"**(或"Specify path on diagram")。
-
这样CLN节点会出现一个
path输入接线端。 -
将上一步构建的路径连接到这个
path输入端。
LabVIEW代码段示意:

5.3 对于通过字符串动态加载的DLL(如调用LoadLibrary)
如果你的程序使用调用库函数节点的"动态加载"方式,也可以按照上述方法构建完整路径后传入。
修改所有相关的地方,确保所有DLL的调用都使用动态路径。
5.4 测试开发环境下的运行
在修改完成后,先在开发环境下运行,确保程序能正常加载所有DLL。由于我们使用了应用程序目录,它在开发环境下会返回当前VI的目录,因此路径也是正确的。
6. 第三步:配置应用程序生成(EXE)
6.1 将Libs目录添加到LabVIEW项目
在项目浏览器中:
-
右键点击"我的电脑" → "添加" → "文件夹(快照)"。
-
选择项目根目录下的
Libs文件夹,将其添加到项目中。
6.2 在EXE生成规范中包含Libs目录
-
在项目浏览器中,右键"程序生成规范" → "新建" → "应用程序 (EXE)"。

-
在配置对话框中,切换到**"源文件"**选项卡。
-
在左侧"项目文件"视图中,找到刚刚添加的
Libs文件夹。 -
选中它,点击中间的蓝色箭头(添加到右侧的"始终包括"列表)。
-
这样
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. 第五步:验证与测试
-
在客户机上安装生成的安装程序。
-
检查安装目录结构,确认
Libs\存在且包含所有DLL。 -
运行应用程序,测试所有功能,确保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并更新代码。 -
移植性强:即使将来改变目录结构,只需修改路径拼接部分。
