解决方案
当调用库函数节点尝试加载按名称(而不是路径)指定的共享库时,LabVIEW将依赖于平台定义的操作系统搜索算法的修改版本。因此,必须将这些按命名指定的共享库保存在平台的系统搜索算法所搜索的目录之一中。
注意:本文档仅介绍LabVIEW如何在定位“调用库函数”对话框中按名称指定的共享库。如按路径指定共享库,LabVIEW将使用其自己的算法查找共享库。发布或重定位VI和应用程序时,按路径指定共享库会产生不同的结果。有关这些后果以及LabVIEW如何通过路径加载共享库的更多信息,请参见LabVIEW帮助(在下面链接)中的“Specifying the Location of Shared Libraries on Disk”主题。
Windows
当你在Windows操作系统上用名字指定共享库时,LabVIEW会通过调用使用标志LOAD_WITH_ALTERED_SEARCH_PATH的
Win32函数LoadLibraryEx
找到共享库。 MSDN中的“Dynamic-Link Library Search Order”主题(在下面链接)描述了该函数搜索的具体路径。但是,LabVIEW对该搜索算法进行了以下两项修改:
- LabVIEW会在其他任何路径之前搜索LabVIEW资源路径(
<labview>\resource)
- 在调用
LoadLibraryEx
之前,LabVIEW将当前路径设置为LabVIEW资源路径 (<labview>\resource
)。在LoadLibraryEx
完成执行后,LabVIEW将当前路径恢复为其先前的值。
Linux
当你在Linux操作系统上用名字指定共享库时,LabVIEW会通过调用RTLD_NOW为mode参数的
函数dlopen来定位共享库
。有关其行为的更多详细信息,参见dlopen
主页。此函数会在以下位置搜索:
RPATH
LD_LIBRARY_PATH
_CS_LIBPATH
LabVIEW未定义LD_LIBRARY_PATH
或_CS_LIBPATH
的值,但LabVIEW确实为RPATH
指定了以下位置。
对于在LabVIEW开发环境中运行的VI, RPATH
按顺序包括以下目录:
一般位置 | 最常见的路径 |
<labview>/patchlib | /usr/local/natinst/LabVIEW <year> |
/usr/X11R6/lib | /usr/X11R6/lib |
/usr/lib | /usr/lib |
<labview> | /usr/local/natinst/LabVIEW <year> |
<labview>/linux | /usr/local/natinst/LabVIEW <year>/linux |
<labview>/resource | /usr/local/natinst/LabVIEW <year>/resource |
对于在LabVIEW运行引擎中运行的LabVIEW生成的应用程序, RPATH
按顺序包括以下目录:
一般位置 | 最常见的路径 |
<labview RTE>/patchlib | /usr/local/lib/LabVIEW <year>/patchlib |
<labview RTE> | /usr/local/lib/LabVIEW <year> |
<labview RTE> 的父目录中的patchlib | /usr/local/lib/patchlib |
/usr/X11R6/lib | /usr/X11R6/lib |
/usr/lib | /usr/lib |
<labview RTE> 父目录 | /usr/local/lib |
<labview RTE>/linux | /usr/local/lib/LabVIEW <year>/linux |
<labview RTE> 的父目录中的linux | /usr/local/lib/linux |
<labview RTE> 的父目录中的resource | /usr/local/lib/resource |
Mac OS X
当你在Mac OS X操作系统上用名字指定共享库时,LabVIEW会加载框架和dylib。 LabVIEW最初尝试通过依次搜索以下目录来将两种共享库作为框架加载:
一般位置 | 最常见的路径 |
应用程序的私有框架目录 | LabVIEW.app/Contents/Frameworks 或<Application>.app/Contents/Frameworks |
<labview>/resource | /Applications/National Instruments/LabVIEW <year>/resource |
用户框架目录 | ~/Library/Frameworks |
<User Application Support>/National Instruments 及其所有子目录 | ~/Library/Application Support/National Instruments 及其所有子目录 |
本地框架目录 | /Library/Frameworks |
<Local Application Support>/National Instruments 及其所有子目录 | /Library/Application Support/National Instruments 及其所有子目录 |
系统框架目录 | /System/Library/Frameworks |
系统专用框架目录 | /System/Library/PrivateFrameworks |
如果LabVIEW无法将共享库作为框架加载,则LabVIEW将尝试使用dlopen
函数将共享库作为dylib加载。有关该功能执行的搜索顺序,请参阅Mac OS X开发人员库:dlopen(3)Mac OS X手册页(下面链接)。
注意:如果您将共享库名指定为library.*
,则LabVIEW将.*
替换为.framework
。