我们知道,不是所有的板卡等硬件都提供了LabVIEW库。所以动态库(DLL)是我们写测控软件绕不开的一个话题。本篇推送我们聊一聊什么是动态库、它是怎么实现的、在LabVIEW里我们又如何使用它。
什么是动态库? 动态库全称动态链接库(Dynamic Link Library,DLL), 是一个包含函数和数据的模块,它可以被其它应用程序或者DLL使用。
动态链接库是怎么编写的呢? 简单来说就是通过dllexport标识出需要导出的函数和变量。 我们分别看一下C和C++编写的动态库代码结构。
C语言编写的动态链接库代码示例:
//CLib.h #ifndef C_LIB_H #define C_LIB_H //需要导出的函数按照指定格式声明 //extern int __declspec(dllexport) exportFunction(type para, ...); //通过DLL导出add函数 extern int __declspec(dllexport) add(int x,int y); #endif //CLib.c #include "Clib.h" //add函数实现 int add( int x, int y ) { return x + y; }
C++语言编写的动态链接库代码示例:
//CplusplusLib.h #ifndef LIB_H #define LIB_H //需要导出的函数按照指定格式声明 //extern "C" int __declspec(dllexport) exportFunction(type para, ...); //通过DLL导出add函数 extern "C" int __declspec(dllexport) add(int x, int y); #endif //CplusplusLib.cpp #include "CplusplusLib.h" //add函数实现 int add( int x, int y ) { return x + y; }
与C语言编写的动态链接库相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,int y) 这一导出语句,在C代码中没有”C” ,而在C++代码中多了一个”C”。 原因是C++编译器与C编译器在对程序进行编译的时候,对函数声明的编译会有所区别。加上”C”,是为了告诉C++编译器,使用C编译器的方式对这一个函数声明进行编译。这样,在C程序调用C++写的动态链接库的时候,不会发生因为寻找不到对应的函数名(编译后的)而发生Link错误。
LabVIEW如何调用动态库?
我们以某品牌数据采集卡为例,说明一下如何使用动态库。 安装好驱动后,我们可以找到该品牌数据采集卡提供的动态库函数和头文件,D2K-Dask.dll和D2kDask.h。
方法1:直接调用 所谓直接调用,就是使用Call Library Function Node调用。这个VI位于Connectivity->Librarie&Executables分类下。 在程序框图里放置Call Library Function Node,双击进行设置。在Library name or path中设置到动态库文件,在Function name中选择需要调用的函数(LabVIEW会自动解析出该动态库导出的函数清单)。

例如我们选择D2K_AI_VReadChannel函数。这里我们需要找到动态库的文档,按照文档里提供的函数说明为CalDl Library Function Node设置好D2K_AI_VReadChannel函数的参数和返回值。
I16 __stdcall D2K_AI_VReadChannel (U16 CardNumber, U16 Channel, F64 *voltage)
将Call Library Function设置对话框切换到Pa
ramete
rs 标签页,设置好返回值和参数。error(return value)、cardNumber和channel都是值传递的参数,“Type”选择Numeric,“Data type”选择Unsigned 16-bit Interger,“Pass”选择Value;voltage是指向F64类型数据的指针,“Type”选择Numeric,“Data type”选择8-byte Double,“Pass”选择Pointer to Value。

设置好之后的Call Library Function Node类似下图,在左、右侧连接好对应参数即可调用D2K_AI_VReadChannel函数。

这个设置和调用过程,调用库函数个数较少时还是可以接受的。如果库函数的数量比较多,挨个设置很繁琐也容易出错。针对这种情况,LabVIEW有更好的方法,也就是我们要介绍的方法2。
方法2:动态库封装成VI库 Tools->Import->Shared Library打开Import Shared Library工具。

Step1,打开Import Shared Library,选择Create VIs for a shared library。

Step2,选择动态库文件和对应的头文件。注意这里头文件必须是C/C++规范的。

Step3,根据需要设置头文件包含路径和预处理定义。如果不需要,可以留空。

Step4,LabView自动识别出动态库里可以封装成VI导出的函数。
例如我们前面设置的D2K_AI_VReadChannel,这里自动识别出函数原型来了。

Step5,设置VI库名称和存放路径。路径建议使用默认路径,放置在用户库里。

Step6,设置出错处理方式。

Step7,设置各个导出函数(VI函数),一般可选择使用默认设置。

Step8,LabVIEW给出一个即将要生成的VI库的汇总信息。

Step9,生成中。

Step10,完成VI库生成。
勾选“Open the generated library”可以打开生成的VI库;勾选View the report可以查看有关所生成库的报表。

打开刚才生成的VI库,可以看到里面封装了非常多的库函数。这些库函数如果按照方法1去挨个设置,显然工作量是非常大的。

生成的动态函数VI库怎么使用呢?
在程序框图里找到User Libraries,里面就有刚才我们生成的D2K-DaskVI库。

VIs下面列出了所有库函数对应的VI,把你需要的拖放到程序框图上,按照输入输出类型连接好就可以了。

比如D2K AI V Read Channel.vi,显示Label、不勾选View as icon,如下图,输入输出非常明了。

以上是C/C++动态链接库的基本知识和LabVIEW中如何使用C/C++动态链接库的方法介绍,希望能够帮助到大家。
编辑:黄飞
到此这篇labview调用dll动态库出现内存泄露(labview调用c++ dll动态库)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/cjjbc/15992.html