LabVIEW的调用库函数节点是如何搜寻共享库的路径?

更新 Aug 31, 2023

适用于

软件

  • LabVIEW

操作系统

  • Windows
  • Linux
  • Mac OS X

问题详述

我在LabVIEW调用的一个调用库函数节点找不到我在“调用库函数功能”对话框中指定名称的共享库。我需要把共享库保存在哪里,LabVIEW可以找到它?

解决方案

当调用库函数节点尝试加载按名称(而不是路径)指定的共享库时,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