当前位置:网站首页 > C++编程 > 正文

labview调用dll动态库出现内存泄露(labview调用c++ dll动态库)



我们知道,不是所有的板卡等硬件都提供了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会自动解析出该动态库导出的函数清单)。

66617dba-07ef-11ee-962d-dac502259ad0.png

例如我们选择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

ram

ete

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。

 

 

66c843b0-07ef-11ee-962d-dac502259ad0.png

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

670a2b04-07ef-11ee-962d-dac502259ad0.png

这个设置和调用过程,调用库函数个数较少时还是可以接受的。如果库函数的数量比较多,挨个设置很繁琐也容易出错。针对这种情况,LabVIEW有更好的方法,也就是我们要介绍的方法2。

方法2:动态库封装成VI库 Tools->Import->Shared Library打开Import Shared Library工具。

672856b0-07ef-11ee-962d-dac502259ad0.png

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

67626a44-07ef-11ee-962d-dac502259ad0.png

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

67a6018c-07ef-11ee-962d-dac502259ad0.png

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

67d7c8c0-07ef-11ee-962d-dac502259ad0.png

Step4,LabView自动识别出动态库里可以封装成VI导出的函数。

例如我们前面设置的D2K_AI_VReadChannel,这里自动识别出函数原型来了。

68066680-07ef-11ee-962d-dac502259ad0.png

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

686f7134-07ef-11ee-962d-dac502259ad0.png

Step6,设置出错处理方式。

68a3c29a-07ef-11ee-962d-dac502259ad0.png

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

68d2a754-07ef-11ee-962d-dac502259ad0.png

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

69274138-07ef-11ee-962d-dac502259ad0.png

Step9,生成中。

6993d078-07ef-11ee-962d-dac502259ad0.png

Step10,完成VI库生成。

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

69cccf04-07ef-11ee-962d-dac502259ad0.png

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

69fef4ac-07ef-11ee-962d-dac502259ad0.png

生成的动态函数VI库怎么使用呢?

在程序框图里找到User Libraries,里面就有刚才我们生成的D2K-DaskVI库。

6a2bbc76-07ef-11ee-962d-dac502259ad0.png

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

6a60ac74-07ef-11ee-962d-dac502259ad0.png

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

6a962674-07ef-11ee-962d-dac502259ad0.png

以上是C/C++动态链接库的基本知识和LabVIEW中如何使用C/C++动态链接库的方法介绍,希望能够帮助到大家。

编辑:黄飞

 

到此这篇labview调用dll动态库出现内存泄露(labview调用c++ dll动态库)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • crnaira是什么品牌的手表c069型号多少钱(crnaira是什么手表价格多少)2025-10-29 08:36:07
  • c++ 条件变量 future(c++ 条件变量和读写锁)2025-10-29 08:36:07
  • convoy怎么读(convey怎么读)2025-10-29 08:36:07
  • win10打印机共享11b报错(win10打印机共享错误0×00000bcb)2025-10-29 08:36:07
  • ptl审稿周期(applied optics审稿周期)2025-10-29 08:36:07
  • 三星c7000支持电信吗(三星c7000支持nfc吗)2025-10-29 08:36:07
  • wacc和apv和fte的比较(ac fvoci fvtpl区别)2025-10-29 08:36:07
  • can总线通信接口(can总线通信故障怎么解决)2025-10-29 08:36:07
  • tcp工具坐标系的标定方法(tcp标定不准的原因)2025-10-29 08:36:07
  • excel文件比较工具(excel文件工具选项不见了)2025-10-29 08:36:07
  • 全屏图片