• 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文件包含了所有库函数 库目录
    相关文章
    相关标签/搜索
    每日一句
      每一个你不满意的现在,都有一个你没有努力的曾经。
    公众号推荐
       一个历史类的公众号,欢迎关注
    一两拨千金
    刘伯温四肖4码期期中 剑川县| 舟山市| 右玉县| 巨鹿县| 葫芦岛市| 克拉玛依市| 老河口市| 石嘴山市| 塔河县| 安新县| 社旗县| 鹿泉市| 梁平县| 花莲市| 巴林左旗| 松潘县| 北海市| 融水| 武乡县| 赤城县| 吴旗县| 恩平市| 永吉县| 星座| 奉节县| 全南县| 墨玉县| 鄄城县| 册亨县| 宜城市| 岢岚县| 宣威市| 海原县| 彰化县| 法库县| 吉林市| 财经| 石渠县| 临澧县| 怀宁县| 噶尔县| 苏尼特右旗| 微博| 黔江区| 德钦县| 搜索| 宁陵县| 赤壁市| 嘉禾县| 茌平县| 阿城市| 教育| 石楼县| 宁蒗| 沁源县| 无极县| 北流市| 沭阳县| 吴堡县| 兰溪市| 进贤县| 恩施市| 吴旗县| 肃北| 邳州市| 东丰县| 滦南县| 屏东县| 义马市| 海林市| 黄龙县| 苏尼特左旗| 汾阳市| 安陆市| 九寨沟县| 永宁县| 东阳市| 广昌县| 长武县| 尉犁县| 巴楚县| 德昌县| 舟曲县| 色达县| 吴川市| 连江县| 衡东县| 曲靖市| 崇明县| 九寨沟县| 施秉县| 高邮市| 蓬溪县| 宜兴市| 溆浦县| 合山市| 玉林市| 即墨市| 肥东县| 隆尧县| 循化| 巴塘县| 若羌县| 商城县| 连云港市| 丰顺县| 灵寿县| 油尖旺区| 遵义市| 天津市| 安图县| 黄梅县| 大邑县| 桃园市| 西贡区| 开原市| 读书| 潍坊市| 奉化市| 临洮县| 永丰县| 循化| 沙坪坝区| 芦山县| 拜城县| 汤原县| 潍坊市| 泰安市| 嵊州市| 垣曲县| 新乡县| 时尚| 象州县| 泰安市| 滁州市| 东辽县| 腾冲县| 奉贤区| 万源市| 探索| 恭城| 石泉县| 永嘉县| 金阳县| 江川县| 玉门市| 兰州市| 宁夏| 健康| 巴林左旗| 汉寿县| 齐河县| 彩票| 宜君县| 怀远县| 天水市| 樟树市| 吉木萨尔县| 乐东| 沙洋县| 巫溪县| 都安| 清丰县| 乃东县| 勃利县| 法库县| 珲春市| 定远县| 五寨县| 云阳县| 邹城市| 云霄县| 板桥市| 西乌珠穆沁旗| 嘉峪关市| 疏勒县| 芦溪县| 东安县| 独山县| 会理县| 神木县| 饶阳县| 栾城县| 和硕县| 平利县| 临澧县| 乌拉特前旗| 保定市| 潼南县| 阿荣旗| 红河县| 武安市| 岳西县| 云安县| 班戈县| 准格尔旗| 曲阳县| 手游| 蓝山县| 夏邑县| 曲阜市| 广宁县| 双牌县| 常熟市| 渭源县| 崇仁县| 南涧| 姚安县| 朔州市| 沁阳市| 天柱县| 和硕县| 琼中| 武定县| 甘德县| 贵南县| 陕西省| 茂名市| 邹城市| 绥芬河市| 丹棱县| 平阳县| 合作市| 诸暨市| 正安县| 辽源市| 普宁市| 英吉沙县| 麻江县| 富源县| 锦屏县| 景泰县| 扎兰屯市| 元谋县| 临洮县| 喜德县| 太康县| 牙克石市| 成武县| 庆阳市| 南平市| 安康市| 孙吴县| 郸城县| 巴青县| 武城县| 通山县| 商洛市| 丘北县| 宾川县| 达孜县| 新化县| 德江县| 平舆县| 荥阳市| 辽宁省| 称多县| 南召县| 噶尔县| 调兵山市| 孟津县| 彰化县| 大连市| 阳春市| 安宁市| 阜康市| 开化县| 仁化县| 修水县| 太原市| 怀柔区| 富民县| 金山区| 临沧市| 庐江县| 凭祥市| 四平市| 琼中| 博湖县| 高碑店市| 密云县| 延寿县| 锡林浩特市| 桓台县| 衡山县| 璧山县| 日喀则市| 苍山县| 永清县| 平凉市| 谷城县| 清流县| 平乡县| 万山特区| 沭阳县| 九龙县| 龙海市| 通海县| 乌海市| 石城县| 工布江达县| 额济纳旗| 永清县| 辽宁省| 定远县| 穆棱市| 镇赉县| 论坛| 肇庆市| 安达市| 盐源县| 龙岩市| 富平县| 大连市| 金寨县| 许昌市| 财经| 肇源县| 保康县| 溆浦县| 翁源县| 中卫市| 都江堰市| 日土县| 潮安县| 双峰县| 大田县| 潞城市| 札达县| 孝感市| 鹤岗市| 闸北区| 安陆市| 民丰县| 杭锦后旗| 涿州市| 南通市| 东光县| 江都市| 赤峰市| 无极县| 乃东县| 夏邑县| 定襄县| 惠东县| 霍州市| 钟山县| 石景山区| 增城市| 思茅市| 卢湾区| 沅陵县| 察隅县| 梁河县| 磐石市| 崇礼县| 南皮县| 化隆| 乐亭县| 轮台县| 犍为县| 嫩江县| 甘泉县| 吉安县| 中西区| 寿光市| 栾城县| 紫金县| 枣强县| 隆昌县| 无棣县| 宜章县| 英德市| 天峨县| 安顺市| 八宿县| 叙永县| 新蔡县| 尚志市| 温泉县| 重庆市| 邓州市| 巴林右旗| 文昌市| 库伦旗| 犍为县| 永登县| 江阴市| 西吉县| 陈巴尔虎旗| 公安县| 西林县| 江油市| 湘潭市| 宜昌市| 抚州市| 崇礼县| 大兴区| 毕节市| 娄底市| 寿光市| 襄汾县| 临颍县| 柳州市| 三原县| 任丘市| 富裕县| 蓝山县| 通江县| 丹巴县| 天等县| 平江县| 阳朔县| 桐柏县| 灌南县| 贵南县| 新化县| 珲春市| 稷山县| 茌平县| 阜新| 密山市| 温泉县| 宁城县| 拉萨市| 嘉义县| 江阴市| 烟台市| 西平县| 孟州市| 寿光市| 江西省| 山西省| 和硕县| 洪江市| 开化县| 莎车县| 成都市| 江都市| 合阳县| 四平市| 贵港市| 搜索| 江城| 托里县| 北辰区| 绥中县| 嘉荫县| 宁南县| 临朐县| 沾化县| 邵武市| 普洱| 商水县| 顺昌县| 航空| 陆丰市| 潢川县| 班玛县| 崇左市| 靖宇县| 郓城县| 渝中区| 江西省| 巴林左旗| 马关县| 肃北| 石门县| 濉溪县| 贺州市| 瑞丽市| 雅安市| 十堰市| 阜新市| 普安县| 定远县| 敖汉旗| 宾川县| 临颍县| 翁牛特旗| 团风县| 新龙县| 怀集县| 黑水县| 宜章县| 龙口市| 茌平县| 汶上县| 莱西市| 长兴县| 扎兰屯市| 富源县| 灌南县| 大姚县| 呼伦贝尔市| 杭锦后旗| 从化市| 前郭尔| 金山区| 吉安县| 梧州市| 弥渡县| 平顺县| 白山市| 宁津县| 桓台县| 上杭县| 嘉定区| 肥乡县| 和田县| 开平市| 呼伦贝尔市| 寻甸| 清丰县| 织金县| 康平县| 嘉祥县| 武山县| 洪洞县| 汤阴县| 祁东县| 长沙市| 旺苍县| 嵩明县| 廉江市| 宁南县| 五指山市| 龙川县| 义马市| 忻州市| 师宗县| 浙江省| 靖远县| 津市市| 大同市| 宿松县| 柳江县| 黄平县| 澄城县| 长春市| 兰考县| 营山县| 乡城县| 师宗县| 皋兰县| 桓仁| 治县。| 仪征市| 峨眉山市| 萍乡市| 治多县| 上饶市| 阳曲县| 信阳市| 永平县| 沧源| 屯门区| 石家庄市| 桦川县| 莲花县| 旌德县| 周宁县| 呼玛县| 东台市| 托克逊县| 巧家县| 四会市| 盐山县| 平远县| 梅河口市| 刚察县| 太康县| 门头沟区| 沅江市| 镇康县| 财经| 和静县| 舟曲县| 大厂| 陕西省| 营山县| 湘潭市| 义乌市| 五寨县| 凌源市| 奉新县| 呼玛县| 军事| 郧西县| 克东县| 汉阴县| 大丰市| 拉孜县| 长汀县| 漯河市| 东兰县| 若羌县| 保德县| 林周县| 游戏| 苏尼特右旗| 苏州市| 辽宁省| 呼和浩特市| 饶河县| 军事| 胶州市| 定兴县| 鄂州市| 珲春市| 潼关县| 郓城县| 元阳县| 黔南| 崇礼县| http://www.vjtkad.fit http://m.ajybll.fit http://m.lqrops.fit http://znnnph.fit http://m.jkaybd.fit http://www.hxuger.fit http://wap.kldeqe.fit http://m.cooxko.fit http://gptuvw.fit http://www.esvvll.fit http://wap.xbeidr.fit http://m.ymslih.fit http://aqelts.fit http://rjqkqi.fit http://m.hfrdor.fit http://wap.tnmqmb.fit http://m.pqeszo.fit http://wap.agxlgm.fit