开发区域

先进与MATLAB软件开发

MATLAB c++

大家好!今天我想介绍一个客座博客,Vivek Bhownani谁是首席开发人员一个激动人心的新功能在R2019a打开方便地访问c++库,无需编写任何c++代码。把它拿走Vivek……

有一个c++库使用或想要使用MATLAB ?我们听到来自用户的请求所有的时间希望调用c++库生成对象从机器学习游戏开发。OpenCV, Tensorflow LibXL是一些例子。

包装一个c++库,用于从外部环境可以是一个非常耗时的任务,需要大量的开发工作。我们的目标是使您能够调用c++没有编写任何c++代码,可能带来的日子为包装一个图书馆工作几个小时。

多年来,MATLAB提供的能力通过包装在C接口调用这些库和使用LOADLIBRARY。MATLAB也提供了墨西哥人的界面,你可以写一个MATLAB包装文件调用C或c++功能。然而,每一个选择都有它的局限性,也提供了一种直接的方式来调用MATLAB c++。这就是为什么我在R2019a兴奋的新功能,帮助您从MATLAB调用c++库。MATLAB c++说话!

我们的用户角色我想接触两种不同类型的用户通过这篇文章。你是一个出版商图书馆如果你想让某在MATLAB c++库可供调用。你是一个最终用户如果你想简单地调用库通过其发布接口。

内容

你不需要知道c++调用c++

我们想帮助出版商关注构建应用程序基于你的c++库。事实上,你甚至不需要知道很多c++。对我们的离开。

痛饮是一个工具,提供了一种方法来发布包装器接口的c++库,可以使用包括Python和Java环境。但是用户需要编写特殊痛饮接口代码,他们必须学习和维护。不像痛饮,MATLAB将尝试为您生成一个接口定义文件。然后您可以编辑这个文件在指定块对界面进行定制您的需求。你不需要学习特定的代码的方法。

作为一个最终用户,你可能甚至不需要创建的接口文件,也许有人会给你写一个。

我们鼓励你们中的一些人作为出版商和图书馆创建这些接口文件你想与最终用户分享。你可能是一个开发人员写的c++库和想要达到更广泛的受众;或者你的公司提供硬件的驱动程序,可以用于MATLAB。其他出版商可能只是想分享他们的工作来帮助其他用户正在调用的调用c++库。作为一个出版商,你将需要一个兼容的c++编译器。如果你是一个终端用户,您不需要一个c++编译器调用库。

让我们看看叫我写一个c++类

我创建了两个类c++的一个汽车引擎的例子:

类引擎{私人:int fNumberOfCylinders;公众:发动机(int numcylinders): fNumberOfCylinders (numcylinders) isServiced (false) {} int getNumCylinders () const{返回fNumberOfCylinders;}bool isServiced;};类车{私人:引擎fEngine;公众:汽车发动机(引擎):fEngine(引擎){}Engine& getEngine(){返回fEngine;}};

建筑界面

因为这个库只是一个头文件,我们可以做一个“直接”构建使用以下功能:

clibgen.generateLibraryDefinition (“auto.h”);构建(defineauto);
警告:只有指定头文件;假设这是一个只包括头文件的库。如果库文件也需要指定,使用“库”选项。警告:文件的清单。json的没有找到。2015年使用Microsoft Visual c++编译器。定义文件生成的C: \ BlogPost \ defineauto。篇mlx和数据文件C: \ \数据。xml的包含定义9构造由MATLAB。金宝app构建使用构建(defineauto)。构建接口文件“autoInterface.dll”。autoInterface接口文件。dll' built in folder 'C:\BlogPost\auto'. To use the library, add the interface file folder to the MATLAB path.

您可以安全地忽略警告在这种情况下生成的。我们发出警告,提醒用户,我们假设这是一个只包括头文件的库,如果这是不准确的,那么应该使用“库”选项提供图书馆。不要忘记添加生成的文件夹“汽车”(包含生成的接口)到MATLAB路径。

目录“汽车”);

就这样,我们现在准备从MATLAB调用这个库

我们首先创建一个汽车的引擎

eng = clib.auto.Engine (4);车= clib.auto.Car (eng);car.getEngine.isServiced
ans =逻辑0

现在让我们服务引擎,检查车:

eng。isServiced = true;car.getEngine.isServiced
ans =逻辑1

MATLAB创建处理代表c++对象。如你所见,“eng”指向车内发动机(“getEngine”方法返回的对象的“汽车”类)。然而,它不能被用来破坏引擎车内,即。,车子继续自己的引擎。注意到当我们调用删除引擎。

删除eng (eng)
eng =处理引擎删除
car.getEngine%(引擎)的汽车仍然是完好无损。
ans =引擎的属性:isServiced: 1

现在让我们看一个加密的例子

这是一块c++代码调用一个SpaceCrypto库中的加密算法加密字符串“hello world !”然后随后调用解密得到原始字符串。

# include < iostream > #包括“cryptopp_wrapper。使用名称空间std h”;int main(){/ /调用加密cout < <“空间包装测试!”< < endl < < endl;SpaceCrypto: CryptBlowFish你好;hello.setPlainString (“HelloWorld !”);hello.setKey (“mySecUreKey ! !”);std:: string地下室;地下室= hello.Encrypt ();/ /调用解密cout < <“纯文本:HelloWorld !”< < endl;cout < <“地穴文本:“< <地下室< < endl;hello.reset (); hello.setEncString(crypt); hello.setInputMode(SpaceCrypto::HEX); hello.setKey("mySecUreKey!!"); hello.setOutputMode(SpaceCrypto::NORMAL); cout<<"Decry Text: "<
           

建筑界面

在这里,我们需要做更多的工作比最后一个例子,但我们仍然不需要编写c++代码。我们有另一个方法来建立接口,这是一个多步骤的过程——生成定义文件,提供定义,然后构建。

设置环境

loc =“cryptopp700”;dllLoc = fullfile (loc,“x64 \ DLL_Output \释放”);路径= getenv (“路径”);setenv (“路径”,(dllLoc“;”路径]);

生成的定义

headerFiles =“cryptopp_wrapper.h”;includePath = loc;outputFolder = pwd;库= [fullfile (loc,“x64 \ DLL_Output \ \ cryptopp.lib发布”),fullfile (loc,“x64 \ DLL_Output \ \ cryptlib.lib发布”));clibgen.generateLibraryDefinition (headerFiles“IncludePath”includePath,“库”、图书馆、“OutputFolder”outputFolder,“PackageName”,“密码”,“详细”,真正的);
警告:一些c++语言结构不支持在头文件,而不是进口的。金宝app2015年使用Microsoft Visual c++编译器。定义文件生成的C: \ BlogPost \ definecrypto。篇mlx和数据文件C: \ \ cryptoData。xml的包含定义20构造由MATLAB。金宝app4构造需要额外的定义。包括这些结构的界面,编辑定义在“C: \ BlogPost \ definecrypto.mlx”。构建使用构建(definecrypto)。

上述步骤生成定义文件。这个列表的所有类、函数枚举等等,我们读在头文件。

定义文件…为什么我需要它?

大部分的工作流自动化构建c++接口。MATLAB提供的头文件读取并生成一个接口库,提供了一种方法来调用每个函数/类库。然而,当我们不能自动调用这样的功能,我们需要帮助出版商指定如何调用这些函数(点击这里为例)。生成的文件的一个片段:

提供您想要调用的函数的定义,如果他们不完全定义。使用c++代码(如上所示)来理解哪些功能需要定义。

现在构建接口通过调用:

构建(definecrypto)
构建接口文件“cryptoInterface.dll”。cryptoInterface接口文件。篇dll的建在文件夹C: \ \加密”。使用图书馆,MATLAB接口文件文件夹添加到路径。

请注意:你需要一个兼容的c++编译器的编译器库建成。

我们现在准备调用MATLAB的图书馆。更重要的是,我们有一个接口,出版商可以与最终用户,他们不需要任何c++编译器或需要知道调用库。调用这个在MATLAB c++库就像调用MATLAB代码的其他部分。

进口SpaceCrypto图书馆

目录“密码”)loc =“cryptopp700”;dllLoc = fullfile (loc,“x64 \ DLL_Output \释放”);路径= getenv (“路径”);setenv (“路径”,(dllLoc“;”路径]);进口clib.crypto。*

加密原始消息

cryptObj = SpaceCrypto.CryptBlowFish;cryptObj.setPlainString (“MATLAB c++说话!”);%使用MATLAB字符串cryptObj.setKey (“mySecUreKey ! !”);encryptedMessage = cryptObj.Encrypt ()
encryptedMessage = " 3540541 c31806edd0fed2ad653a9b1ead224d192aa281b26 "

解密索取原始消息

cryptObj = SpaceCrypto.CryptBlowFish;cryptObj.setEncString (encryptedMessage);cryptObj.setInputMode (SpaceCrypto.OUT_TYPE.HEX);% MATLAB c++ enum的枚举cryptObj.setKey (“mySecUreKey ! !”);cryptObj.setOutputMode (SpaceCrypto.OUT_TYPE.NORMAL);originalMessage = cryptObj.Decrypt
originalMessage = " MATLAB c++说话!”

试试自己的c++库接口

使用上述步骤来包装你想调用MATLAB c++库。阅读我们的文档要学习更多的知识。19我们支持很多c+金宝app+ 98等构造函数,类,方法,模板实例化和类型定义。在未来,我们将提供支持std::向量,智能指针,宽字符串,等等。金宝app我们还计划支持自动内存管理在MA金宝appTLAB c++对象。我们要不断完善此功能,我想听到你的声音。发表评论,告诉我们如何去你或什么功能你认为我们应该添加到下一个。我们刚刚开始!




发表与MATLAB®R2019a

|

댓글

댓글을남기려면링크를클릭하여MathWorks계정에로그인하거나계정을새로만드십시오。