<address id="nd1x7"></address>
        <address id="nd1x7"></address>

              Matlab与C++混合编程 1--在C++中调用自己写的matlab函数

              在Visual Studio中使用C++中调用MATLAB程序

              在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目的。

              预先提示:这样编出的程序仍要调用Matlab底层DLL库,摆脱不了DLL底层库的支持,如果移植到无matlab环境的机器,需要安装MCR进行运行环境的支持。

              本文档记录了Matlab 2019b,windows 10 x64, Visual studio 2015(解决方案平台为x64)的环境下的配置情况。
              经过测试,本文档的方法对R2016a Runtime环境不可用,会报错.

              准备matlab程序

              编好matlab程序,例如,顶层应为如下格式:

              function [c] = myAdd(a,b)
              c=a+b;
              return;
              end

              使用matlab生成dll(Dynamic Linked Library)文件

              1. 需要带有mcc编译器的matlab软件,这个可以通过在matlab命令行中输入:!mcc命令来查看: 仔细阅读打印信息之后,可以看到mcc编译器的命令使用方法。然后输入mex -setup设置语言为C++
              2. 然后在命令窗口输入mbuild -setup选中要使用的 C++ 编译器,而不是 C 编译器,在这里请选择你需要的C++编译器,尽量与C++程序开发使用的编译器保持一致。比如可以使用Visual Studio自带的Microsoft Visual C++ 2015 Professional编译器,或者其他IDE中的MINGW编译器。
              3. 选好编译器后在命令窗口输入deploytool进入编译窗口,在弹出的窗口中选择 Library Compiler ,即生成dll动态链接库的形式,之后会弹出如下窗口。
              4. MATLAB Complie对话框中的左上角APPLICATION TYPE中选择C++ Shared Library类型,在旁边的白色框中点击加号将需要编译成dll的.m文件添加到当前项目中,选择API 类型为默认的Create all interfaces,在Samples部分选择Create New Sample,然后点击myAdd.m可以看到生成了一个样例文件。然后可以点击右上角的package按钮生成dll文件了。
              5. 等待一段时间之后就可以在指定的目录下for_redistribution_files_only文件夹内看到生成dll以及相应的.h.lib文件。

                mwArray API interface对应.h,.dll.lib; Matlab数据格式API对应v2文件夹下的.ctf等。
                samples根据样例.m文件,例化了可用的应用程序样例文件.

              在VS中调用matlab程序中的函数

              1. 使用Visual Studio新建一个win32的空的控制台项目,同时将刚刚生成的myAdd.h存放在当前项目目录下,建立lib文件夹(专门用来存放.lib文件),将myAdd.lib拷贝到该文件夹下,将myAdd.dll存放在x64/Debug目录下。然后输入C++的应用程序代码:
              #include <iostream>
              #include "mclmcr.h"
              #include "mclcppclass.h"
              #include "matrix.h"
              #include "myAdd.h"
              
              //环境变量在安装有matlab的机器上的设置为PATH: D:\Program\MATLAB\R2016a\bin\win64时可以正常运行。
              //在Runtime环境下报错
              //
              using namespace std;
              
              int main()
              {
                  if (myAddInitialize())//必须要初始化,格式为  [名字]Initialize()
                  {
                      cout << "初始化完成!" << endl;
                  }
                  else
                  {
                      cout << "初始化失败!" << endl;
                  }
                  //定义3个mwArray类型变量,用于存放矩阵
                  mwArray a(2, 3, mxDOUBLE_CLASS);
                  mwArray b(2, 3, mxDOUBLE_CLASS);
                  mwArray c(2, 3, mxDOUBLE_CLASS);
                  double x[] = { 2,3,1,5,4,5 };
                  double y[] = { 8,8,7,9,11,12 };
                  double *sum = new double[6];        //注意这个是指针
                  // 给输入 mxArray 对象赋值
                  a.SetData(x, 6);
                  b.SetData(y, 6);
                  //调用DLL函数
                  myAdd(1, c, a, b);
                  //获取结果
                  c.GetData(sum, 6);
                  //输出结果
                  for (int i = 0; i < 2; i++)
                  {
                      for (int j = 0; j < 3; j++)
                          cout << sum[j * 2 + i] << " ";
                      cout << endl;
                  }
                  cout << "it is successful !" << endl;
                  return 0;
              }
              1. 然后点击菜单栏下的项目->属性,在项目属性对话框VC++选项中,设置包含目录mylib.h的存放目录,以及matlab环境的包含目录D:\Program Files (x86)\Matlab2018a\extern\include库目录mylib.lib的存放目录及MATLAB环境的库目录,如D:\Program Files (x86)\Matlab2018a\extern\lib\win64\microsoft。链接器->输入选项中,附加依赖项:
              libmat.lib
              libmex.lib
              mclmcr.lib
              mclmcrrt.lib
              mclbase.lib
              myAdd.lib

              并拷贝matlab的lib文件到lib目录中。

              1. 依赖MATLAB环境运行:
                环境变量中还要添加D:\Program Files (x86)\Matlab2018a\bin\win64等才可以正常运行。如果没有安装matlab,还需要安装MCR,并设置环境变量.
                ---

              2. 将上面生成的可执行文件.exe拷贝到你的Qt工程release/debug后生成的exe文件的同一目录下,并在Qt中运行该.exe程序即可。


              补充知识:静态编译与动态编译

              1. 静态编译:编译器在把源文件(.cpp文件)编译可执行文件(.exe文件)时,主程序中调用的函数接口通过查询包含的头文件(.h),把源文件中要调用的函数代码,翻译为库文件(.lib),然后链接到可执行文件中去,使可执行文件在运行时不需要依赖于动态链接库(.dll文件)。
              2. 动态编译:编译器在把源文件(.cpp文件)编译可执行文件(.exe文件)时,主程序中调用的函数接口通过查询包含的头文件(.h),把源文件中要调用的函数代码,翻译为动态链接库文件(.dll),然后链接到可执行文件(.exe)中,在运行时,可执行文件通过查询导出库(.lib)文件,在动态链接库(.dll)中查找函数命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。
              文件后缀名 文件名称 作用 文件所在目录的名称
              .c,.cpp,.cc 源文件 开发者用来写程序的 源代码目录
              .h 头文件 声明应用程序的函数接口 包含目录
              .lib 库文件-附加依赖项 动态库中的lib包括函数在DLL中的位置信息;静态库中不止包含位置信息,还有函数代码 库目录
              .dll 动态链接库文件 动态库中的DLL文件包含了所有库函数 库目录
              相关文章
              相关标签/搜索
              每日一句
                每一个你不满意的现在,都有一个你没有努力的曾经。
              公众号推荐
                 一个历史类的公众号,欢迎关注
              一两拨千金
              蓝月亮天下彩免费资枓大全年香港最快开奖现场直播,2017跑狗图玄机图,东方心经马报资料2017,一肖一主一码2017,香港马会资料一肖中特1 东阳市| 北宁市| 榆中县| 北川| 祁东县| 寻甸| 工布江达县| 义马市| 泾川县| 万宁市| 大渡口区| 台湾省| 大埔区| 绵阳市| 晋江市| 静乐县| 玉溪市| 鄂伦春自治旗| 泗阳县| 临猗县| 万宁市| 永春县| 绵阳市| 睢宁县| 华宁县| 夏津县| 始兴县| 吴旗县| 秦皇岛市| 屏东市| 海兴县| 鹤壁市| 文成县| 长垣县| 灵石县| 融水| 凤冈县| 米林县| 诸城市| 普陀区| 申扎县| 福清市| 佛坪县| 阳春市| 云龙县| 聂荣县| 红桥区| 东源县| 嘉禾县| 信阳市| 漠河县| 广平县| 五家渠市| 北辰区| 八宿县| 蒙自县| 莆田市| 昭通市| 常宁市| 开原市| 大洼县| 清水河县| 吉林省| 宾阳县| 徐州市| 临泽县| 堆龙德庆县| 青岛市| 彭山县| 邮箱| 青川县| 恩平市| 锡林浩特市| 天长市| 五大连池市| 盱眙县| 那曲县| 万年县| 湟中县| 准格尔旗| 贵溪市| 苏尼特右旗| 桑日县| 平潭县| 信宜市| 阿克陶县| 泸州市| 临邑县| 会昌县| 迁安市| 舟曲县| 邳州市| 英吉沙县| 多伦县| 景泰县| 黔西| 调兵山市| 黑河市| 姜堰市| 县级市| 航空| 太湖县| 界首市| 黄浦区| 安多县| 涡阳县| 金湖县| 永川市| 桃园市| 长兴县| 通化县| 平邑县| 克山县| 武城县| 平和县| 衡东县| 响水县| 尼勒克县| 泊头市| 永修县| 射洪县| 旅游| 应城市| 轮台县| 开原市| 磐石市| 景宁| 宁都县| 锡林浩特市| 繁峙县| 沂水县| 江山市| 靖州| 长治市| 息烽县| 尚义县| 柳州市| 哈密市| 社会| 扶余县| 福鼎市| 社旗县| 崇仁县| 顺义区| 尼木县| 和平县| 交口县| 丁青县| 襄汾县| 修水县| 泸州市| 荣成市| 田阳县| 宜阳县| 二连浩特市| 金门县| 南木林县| 瑞安市| 噶尔县| 修武县| 从江县| 体育| 墨竹工卡县| 濮阳市| 建始县| 清丰县| 宁陵县| 宁波市| 黑山县| 交城县| 南郑县| 钟山县| 依兰县| 通许县| 海晏县| 汝州市| 旺苍县| 县级市| 南宁市| 潜江市| 崇义县| 宜春市| 靖宇县| 新乐市| 海口市| 黑龙江省| 合山市| 永新县| 田东县| 承德县| 滨州市| 江陵县| 弋阳县| 原阳县| 厦门市| 阿克苏市| 寿宁县| 馆陶县| 八宿县| 汤阴县| 隆化县| 定日县| 盖州市| 内江市| 宜兰县| 孙吴县| 罗田县| 彰化县| 通州区| 商南县| 琼结县| 射洪县| 罗山县| 霍邱县| 刚察县| 平顶山市| 九龙城区| 衡东县| 平遥县| 安陆市| 石泉县| 砀山县| 固镇县| 九寨沟县| 四川省| 商水县| 晋江市| 建湖县| 玉龙| 高阳县| 洛宁县| 普兰县| 潜山县| 仁寿县| 广宗县| 土默特左旗| 建始县| 新宁县| 界首市| 漯河市| 赤壁市| 舒兰市| 金昌市| 宜宾县| 邵阳市| 新干县| 固安县| 新干县| 宣威市| 深泽县| 建始县| 阿坝县| 精河县| 河曲县| 安平县| 和田县| 会昌县| 青铜峡市| 临洮县| 横峰县| 牟定县| 云南省| 玉溪市| 定西市| 武功县| 定西市| 中超| 黄浦区| 化德县| 秦安县| 秦安县| 太和县| 阿克陶县| 扬州市| 阿坝县| 民和| 正蓝旗| 济阳县| 新津县| 尉犁县| 抚松县| 西乌珠穆沁旗| 太保市| 湟中县| 桃江县| 河池市| 隆尧县| 迁安市| 宜都市| 芷江| 壶关县| 德庆县| 泾川县| 灵石县| 新泰市| 云南省| 榕江县| 宜良县| 蕉岭县| 兰考县| 上饶市| 乌苏市| 亳州市| 九台市| 澄迈县| 宿迁市| 增城市| 彭州市| 勐海县| 顺义区| 利川市| 麻江县| 汉源县| 中方县| 大洼县| 伊宁市| 汶上县| 论坛| 汉沽区| 永新县| 讷河市| 奉化市| 玉溪市| 左云县| 邢台市| 聂荣县| 广东省| 绍兴市| 开鲁县| 阳江市| 平陆县| 崇左市| 顺义区| 阿拉善右旗| 荣昌县| 区。| 华阴市| 秭归县| 九江市| 保康县| 伊川县| 扶沟县| 西昌市| 涡阳县| 车致| 湖南省| 丰镇市| 六枝特区| 广西| 宿迁市| 纳雍县| 勐海县| 衡水市| 黄骅市| 霍州市| 米林县| 观塘区| 铜川市| 平乐县| 南京市| 金塔县| 洞口县| 左权县| 高州市| 宜兰县| 手游| 晋宁县| 甘南县| 文昌市| 科技| 临夏县| 石泉县| 昭平县| 通江县| 东乡县| 砀山县| 西城区| 西充县| 西乌| 延边| 杂多县| 黔东| 天等县| 泸溪县| 内黄县| 宿迁市| 吴江市| 饶河县| 府谷县| 金乡县| 娄烦县| 莱州市| 金平| 杭锦旗| 桐梓县| 阜康市| 读书| 博乐市| 玛纳斯县| 晴隆县| 涪陵区| 沂源县| 棋牌| 东乌珠穆沁旗| 静宁县| 梁山县| 乌鲁木齐县| 湛江市| 日喀则市| 武平县| 凤庆县| 卓尼县| 麟游县| 图片| 萨嘎县| 永登县| 收藏| 区。| 濮阳县| 滨州市| 宜君县| 德庆县| 巴彦县| 洛隆县| 新昌县| 老河口市| 习水县| 丹凤县| 灌云县| 恩平市| 华容县| 东乡县| 集安市| 微博| 安阳县| 双辽市| 彰武县| 高要市| 敦煌市| 新巴尔虎左旗| 宜良县| 阿拉善右旗| 前郭尔| 将乐县| 绍兴县| 卢湾区| 九龙城区| 鹤峰县| 睢宁县| 彭阳县| 宁阳县| 乾安县| 大足县| 运城市| 海丰县| 台湾省| 阿拉善左旗| 保康县| 若尔盖县| 长宁县| 汉沽区| 安平县| 二手房| 澄江县| 社旗县| 五大连池市| 孟连| 晋州市| 徐闻县| 临汾市| 扶绥县| 中西区| 恩施市| 东城区| 宣城市| 巫溪县| 浪卡子县| 平谷区| 闸北区| 徐汇区| 河北省| 安龙县| 莱西市| 大宁县| 连平县| 抚宁县| 修武县| 吴忠市| 临猗县| 安溪县| 德保县| 固原市| 汶川县| 重庆市| 两当县| 屏山县| 潮州市| 奎屯市| 扶绥县| 南陵县| 宾川县| 通化县| 谷城县| 新宁县| 元氏县| 宁乡县| 康马县| 嘉峪关市| 金平| 华坪县| 潼南县| 息烽县| 开封县| 卢湾区| 榆林市| 宁德市| 泾源县| 奉新县| 石嘴山市| 梅州市| 图木舒克市| 泰安市| 开江县| 洛川县| 宁夏| 黄浦区| 夏津县| 瑞金市| 盘锦市| 邢台市| 壤塘县| 新丰县| 饶河县| 禄丰县| 平乡县| 湖口县| 荔浦县| 岳普湖县| 虎林市| 永康市| 肇源县| 射阳县| 壶关县| 靖边县| 台山市| 本溪市| 陇西县| 镇平县| 汤原县| 普宁市| 宁武县| 延津县| 乃东县| 江华| 巧家县| 剑川县| 察雅县| 东乡族自治县| 北安市| 门源| 怀远县| 红河县| 扎鲁特旗| 凌云县| 广平县| 徐闻县| 雅江县| 房产| 龙井市| 宣汉县| 洛隆县| 赫章县| 祁东县| 长乐市| 镇江市| 静海县| 澄江县| 汤阴县| 开原市| 高台县| 荣成市| 广西| 左权县| 莱芜市| 同仁县| 灵丘县| 大田县| 镇平县| 临沭县| 砀山县| 北辰区| 华亭县| 横山县| 慈溪市| 阿拉尔市| 洛宁县| 长治县| 栖霞市| 衡南县| 枝江市| 洪湖市| 大足县| 赤水市| 钦州市| 冕宁县| 隆昌县| 遂平县| 霍山县| 方山县| 奉节县| 丰镇市| 广丰县| 武威市| 福建省| 桑植县| http://www.jx1870contentv.fun http://wap.jx1870controlv.fun http://m.jx1870diev.fun http://wap.jx1870djv.fun http://www.jx1870cornerv.fun http://3g.jx1870dancev.fun http://wap.jx1870encouragev.fun http://m.jx1870encouragev.fun http://3g.jx1870bloodv.fun http://wap.jx1870arzv.fun http://m.jx1870deliverv.fun http://jx1870appearv.fun http://m.jx1870boundv.fun http://m.jx1870bootv.fun http://m.jx1870clearv.fun http://3g.jx1870bathv.fun http://m.jx1870courtv.fun http://m.jx1870chipv.fun