开发区

用MATLAB开发高级软件

MATLAB讲C++

大家好!今天我要介绍一位客户博客作者Vivek Bhownani,他是R2019A中一个令人兴奋的新特性的主要开发者,它可以轻松地访问C++库而不需要编写任何C++代码。把它拿走Vivek。。。

有一个c++库,你使用或想在MATLAB中使用?我们总是听到用户希望调用c++库的请求,这些库涉及从机器学习到游戏开发的各个主题。OpenCV、Tensorflow和LibXL就是一些例子。

包装一个c++库以供外部环境使用是一项非常耗时的任务,需要大量的开发工作。我们的目标是使您能够在不编写任何c++代码的情况下调用c++,从而可能将包装库的工作从几天缩短到几个小时。

多年来,MATLAB提供了调用这些库的能力,方法是将它们封装在C接口中并使用LOADLIBRARY。MATLAB还提供了MEX接口,允许您编写MATLAB包装器文件调用C或c++功能。然而,每个选项都有其局限性,并且都没有提供从MATLAB直接调用c++的方法。这就是为什么我对R2019a中帮助您从MATLAB调用c++库的新功能感到兴奋的原因。MATLAB现在讲c++ !

我们的用户角色:我想通过这篇文章接触两种不同类型的用户。你是出版商如果你想在MATLAB中调用某个c++库。你是一个最终用户如果您希望通过发布的接口调用库。

目录

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

我们希望帮助出版商专注于基于C++库构建应用程序。事实上,您甚至不需要知道很多C++。

SWIG是一种工具,它为C++库提供了一种包装接口,可以从Python和java环境中使用。但是用户需要编写特殊的Sigg接口代码,它们必须学习和维护。不像SWIG,MATLAB将尝试为你生成一个接口定义文件。指定块来根据您的需要定制接口。您不需要学习特定的编码方式。

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

我们鼓励你们中的一些人充当发布者,为希望与最终用户共享的库创建这些接口文件。您可能是编写C++库并希望能接触到更多读者的开发者;或者您的公司提供了可与MATLAB一起使用的硬件驱动程序。其他出版商可能只是想分享他们的工作,帮助其他用户调用你正在调用的C++库。作为发布者,您将需要兼容的C++编译器。如果你是一个最终用户,你不需要一个C++编译器来调用这个库。

让我们看看调用我编写的c++类

我用C++引擎为引擎创建了两个类:

类引擎{private:int-fnumberofcylinds;public:Engine(int-numcylinds):fnumberofcylinds,isServiced(false){int-getnumcylinds()const{return-fnumberofcylinds;}bool-isServiced;};类汽车{private:Engine&fEngine;public:Car(Engine&Engine):fEngine(Engine){}Engine&getEngine(){return fEngine;};

构建接口

由于该库只是一个头文件,我们可以使用以下函数进行“直接”构建:

clibgen.generateLibraryDefinition (“auto.h”); 构建(defineauto);
警告:仅指定头文件;假设这是一个头文件库。如果还需要指定库文件,请使用'Libraries'选项。警告:文件的清单。json的没有找到。使用Microsoft Visual c++ 2015编译器。生成的定义文件'C:\BlogPost\defineauto。mlx'和数据文件'C:\BlogPost\autoData.xml'包含MATLAB支持的9个构造的定义。万博1manbetx构建使用构建(defineauto)。构建接口文件'autoInterface.dll'。接口文件'autoInterface.dll'内置在文件夹'C:\BlogPost\auto'。 To use the library, add the interface file folder to the MATLAB path.

您可以安全地忽略在这种情况下生成的警告。我们发出警告提醒用户,我们假设这是一个仅标题的库,如果这不准确,则应使用“库”选项来提供该库。不要忘记将生成的文件夹“auto”(其中包含生成的接口)添加到MATLAB路径。

地址路径(“汽车”);

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

让我们首先创建一辆有引擎的汽车

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

现在让我们检修发动机,并再次检查汽车:

eng.isservice=true;car.getEngine.isservice
ans=逻辑1

MATLAB创建句柄来表示c++对象。如上所述,'eng'指向汽车内部的引擎(由'car'类中的'getEngine'方法返回的对象)。然而,它不能用来破坏汽车内部的引擎,也就是说,汽车继续拥有它的引擎。注意,当我们在引擎上调用delete时。

删除(英文)英文
eng=已删除引擎的句柄
汽车发动机%这辆汽车(带发动机)仍然完好无损。
ans=具有以下属性的引擎:已服务:1

现在让我们看一个加密示例

下面是一段c++代码,它调用SpaceCrypto库中的加密算法来加密字符串“hello world!”,然后调用decrypt以获取原始字符串。

#include#使用命名空间std;int main(){//Call Encryption cout<<“Space wrapper TEST!”<
           

构建接口

在这里,我们需要做的工作比上一个例子多一些,但是我们仍然不需要编写C++代码。我们有一个可替代的方式来构建接口,它是一个多步骤的过程——生成定义文件,提供定义,然后构建。

设置环境

loc=“加密PP700”;dllLoc=完整文件(loc,“x64 \ DLL_Output \释放”); path=getenv(“路径”); 塞滕夫(“路径”,[dllLoc';'路径]);

生成定义

headerFiles =“cryptopp_wrapper.h”;includePath=loc;outputFolder=pwd;库=[fullfile(loc,“x64 \ DLL_Output \ \ cryptopp.lib发布”),...完整文件(loc,“x64 \ DLL_Output \ \ cryptlib.lib发布”)];clibgen.generateLibraryDefinition(标题文件、,“包含路径”includePath,...“图书馆”,图书馆,“OutputFolder”,输出文件夹,“PackageName”,“密码”,“冗长”,对);
警告:头文件中的一些C++语言构造不支持,不导入。使用微软Visual C++ 2015编译器。生成的定义文件“C:\BlogPo万博1manbetxst\definecrypto.mlx”和数据文件“C:\BlogPost\cryptoData.xml”包含MATLAB支持的20个构造的定义。4构造需要额外的定义。要在接口中包含这些构造,请编辑“C:\BlogPost\definecrypto.mlx”中的定义。使用Build(definecrypto)构建。

上面的步骤生成定义文件。它列出了头文件中读取的所有类、函数、枚举等。

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

在C++接口的构建中,大多数工作流是自动化的。MATLAB读取提供的头文件,生成一个接口库,提供一种调用库中的每个函数/类的方法。然而,有时我们不能自动调用这种功能,并且我们需要发布者帮助指定“如何调用”。这些功能(点击这里为例)。下面是生成文件的片段:

如果您没有调用函数,则提供您想要调用的函数的定义。使用C++代码(如上文所示)来理解哪些函数需要定义。

现在通过调用以下命令来构建接口:

构建(definecrypto)
构建接口文件'cryptoInterface.dll'。接口文件'cryptoInterface.dll'内置在文件夹'C:\BlogPost\crypto'。要使用该库,请将接口文件文件夹添加到MATLAB路径中。

请注意:您需要一个与构建库所用的编译器兼容的c++编译器。

我们现在已经准备好在MATLAB中调用这个库。更重要的是,我们有一个发布者可以与最终用户共享的接口,并且他们不需要编译器或者需要知道任何C++调用库。在MATLAB中调用这个C++库就像调用任何其他的MATLAB代码。

导入SpaceCrypto库

地址路径(“密码”) loc =“加密PP700”;dllLoc=完整文件(loc,“x64 \ DLL_Output \释放”); path=getenv(“路径”); 塞滕夫(“路径”,[dllLoc';'路径]);进口密码学*

加密原始消息

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

解密并检索原始消息

cryptObj=SpaceCrypto.cryptoblowfish;cryptObj.setEncString(encryptedMessage);cryptObj.setInputMode(SpaceCrypto.OUT_TYPE.HEX);C++枚举的Matlab枚举cryptObj.setKey(“mySecUreKey ! !”);cryptObj.setOutputMode(SpaceCrypto.OUT_TYPE.NORMAL);originalMessage=cryptObj.Decrypt
原始消息=“Matlab讲C++”!

尝试与自己的C++库进行接口

使用上面描述的步骤包装一个你想在Matlab中调用的C++库。文档了解更多。在19A中,我们支持很多C++ 98构造万博1manbetx,例如函数、类、方法、模板实例化和Type Debug。将来,我们将提供对std::vector、智能指针、宽字符串等的支持。我们还计划支持在MATLAB中对C++对象的自动内存管理。我们将继续改进这一功能,我希望收到您的来信。请在下面发表评论,并告诉我们您的情况,或者您认为我们接下来应该添加哪些功能。我们才刚刚开始!




发布与MATLAB®R2019a

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。