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文件包含了所有库函数 库目录
            相关文章
            相关标签/搜索
            每日一句
              每一个你不满意的现在,都有一个你没有努力的曾经。
            公众号推荐
               一个历史类的公众号,欢迎关注
            一两拨千金
            管家婆精选心水资料中特网 安乡县| 确山县| 营山县| 台北市| 龙川县| 安西县| 防城港市| 北碚区| 长宁县| 大关县| 宜章县| 犍为县| 项城市| 榆社县| 曲靖市| 洪湖市| 平顶山市| 甘泉县| 泸西县| 资中县| 手机| 齐河县| 黄陵县| 天祝| 长沙市| 元谋县| 海南省| 阿荣旗| 全椒县| 望城县| 淮南市| 三明市| 泰和县| 沽源县| 广州市| 岳阳县| 达日县| 秦皇岛市| 海城市| 华池县| 顺昌县| 宁陕县| 青田县| 出国| 江山市| 宜兴市| 叙永县| 东海县| 天气| 铜山县| 绥德县| 武威市| 连州市| 旅游| 凌海市| 平乡县| 武城县| 平邑县| 灵山县| 霍邱县| 祁门县| 杭锦旗| 得荣县| 名山县| 五常市| 宣汉县| 台北市| 天长市| 荔浦县| 江北区| 会东县| 隆昌县| 米林县| 宣威市| 昌吉市| 昌吉市| 江华| 卢湾区| 酉阳| 额济纳旗| 扬州市| 合山市| 伊金霍洛旗| 仁布县| 平陆县| 乐清市| 萍乡市| 山东省| 商城县| 金堂县| 涟源市| 兴安县| 璧山县| 景德镇市| 新乐市| 定州市| 凤山县| 磐安县| 迁安市| 高唐县| 荔波县| 鹿泉市| 蒙阴县| 北流市| 扶绥县| 类乌齐县| 绿春县| 克拉玛依市| 无极县| 孟村| 桦甸市| 新民市| 曲松县| 太康县| 讷河市| 个旧市| 郯城县| 波密县| 泰和县| 丽江市| 出国| 刚察县| 榆树市| 萍乡市| 元江| 临夏市| 工布江达县| 都匀市| 甘孜县| 巩义市| 鞍山市| 庆城县| 东源县| 西丰县| 喜德县| 内丘县| 秭归县| 昭觉县| 盐城市| 北海市| 海口市| 米易县| 蓝田县| 荃湾区| 两当县| 霍州市| 道孚县| 灌阳县| 霍邱县| 鄂尔多斯市| 怀来县| 中江县| 阳城县| 鄯善县| 南平市| 祥云县| 辛集市| 土默特右旗| 祁阳县| 安多县| 呼玛县| 郧西县| 黄梅县| 乐陵市| 临武县| 新邵县| 兰溪市| 三河市| 屯留县| 延川县| 临清市| 新竹县| 文化| 车致| 砚山县| 金平| 桦南县| 灵川县| 龙胜| 浪卡子县| 兴宁市| 台前县| 宜昌市| 蛟河市| 怀安县| 游戏| 南昌市| 乌什县| 东兰县| 通道| 万全县| 桂阳县| 威信县| 新源县| 唐山市| 福清市| 临沂市| 邓州市| 金堂县| 西贡区| 镇江市| 南召县| 全椒县| 峨山| 上犹县| 昂仁县| 广德县| 柞水县| 徐水县| 竹溪县| 积石山| 五大连池市| 抚顺县| 天门市| 简阳市| 泽库县| 白城市| 于都县| 云霄县| 商都县| 花莲市| 广河县| 南岸区| 阜南县| 万全县| 元谋县| 尤溪县| 黔东| 唐山市| 昌邑市| 玉树县| 土默特左旗| 南溪县| 六枝特区| 乳源| 合山市| 琼结县| 洪雅县| 仲巴县| 大竹县| 毕节市| 临澧县| 屏南县| 赣州市| 漳浦县| 南木林县| 高碑店市| 阿勒泰市| 微博| 武邑县| 衢州市| 湖南省| 安龙县| 大兴区| 金寨县| 丰城市| 余干县| 建阳市| 会昌县| 政和县| 兴化市| 浮山县| 思南县| 石狮市| 凤山市| 固始县| 高雄市| 茌平县| 泸定县| 德令哈市| 镇宁| 手游| 龙陵县| 宁强县| 赫章县| 祥云县| 山阳县| 洛川县| 福贡县| 社旗县| 章丘市| 静安区| 浪卡子县| 虹口区| 大竹县| 葵青区| 仪陇县| 宜兴市| 都匀市| 德惠市| 绵阳市| 苏尼特左旗| 荥经县| 舟曲县| 温泉县| 佛教| 陕西省| 哈密市| 华蓥市| 永顺县| 冕宁县| 鹤峰县| 博爱县| 茌平县| 苗栗县| 光山县| 昌江| 秀山| 墨江| 镇宁| 吉木萨尔县| 大冶市| 北海市| 泸溪县| 汉中市| 和政县| 榆林市| 察隅县| 嘉禾县| 西平县| 赤峰市| 西宁市| 肥城市| 保定市| 巴塘县| 浦东新区| 西昌市| 高雄县| 双鸭山市| 烟台市| 江达县| 安新县| 兴安盟| 全椒县| 樟树市| 屏南县| 含山县| 大连市| 塔城市| 普洱| 祁阳县| 读书| 上犹县| 贵德县| 长泰县| 伊宁市| 夏邑县| 巴楚县| 文登市| 全州县| 清镇市| 陇西县| 深水埗区| 团风县| 江达县| 巴中市| 普兰县| 水富县| 池州市| 肃宁县| 永寿县| 胶南市| 河北省| 嘉祥县| 商南县| 门头沟区| 晋宁县| 保德县| 宁城县| 锡林浩特市| 江北区| 盐津县| 贵阳市| 伊吾县| 贡嘎县| 丰顺县| 会理县| 商水县| 临江市| 藁城市| 北碚区| 清水河县| 习水县| 阳城县| 洛隆县| 黑山县| 靖江市| 黄石市| 谢通门县| 阿瓦提县| 渑池县| 松潘县| 那曲县| 株洲市| 江阴市| 安福县| 黎川县| 侯马市| 巧家县| 普陀区| 元朗区| 凌云县| 页游| 姜堰市| 武功县| 宁武县| 广丰县| 泸西县| 南皮县| 晋州市| 买车| 浪卡子县| 延长县| 霸州市| 海南省| 清新县| 北票市| 突泉县| 积石山| 沂南县| 伊金霍洛旗| 英吉沙县| 平邑县| 安泽县| 延津县| 峨山| 伊金霍洛旗| 阆中市| 蓝山县| 吉安县| 始兴县| 光泽县| 黄浦区| 长治县| 环江| 沅江市| 邳州市| 广河县| 武陟县| 平遥县| 远安县| 财经| 永新县| 卓尼县| 四会市| 读书| 普兰店市| 贵溪市| 永城市| 临沧市| 刚察县| 新营市| 彰化县| 贺兰县| 和田县| 洞口县| 北辰区| 冷水江市| 洞头县| 新竹县| 安岳县| 西丰县| 禄丰县| 安达市| 琼结县| 永济市| 壤塘县| 健康| 陇南市| 扎兰屯市| 东台市| 南通市| 西乌珠穆沁旗| 海盐县| 大城县| 双桥区| 荣成市| 长兴县| 沙湾县| 华坪县| 本溪市| 琼海市| 塔河县| 巴中市| 达拉特旗| 凤山县| 富顺县| 永靖县| 五大连池市| 红安县| 义马市| 灵山县| 龙里县| 盈江县| 永兴县| 福安市| 河南省| 曲水县| 横峰县| 图木舒克市| 和政县| 定陶县| 五常市| 旺苍县| 定兴县| 高唐县| 安宁市| 五家渠市| 登封市| 清丰县| 竹溪县| 仁怀市| 江永县| 江永县| 定南县| 黔南| 邹城市| 缙云县| 河津市| 兴城市| 绥宁县| 内丘县| 剑阁县| 尖扎县| 阳江市| 花莲县| 扬州市| 大埔县| 自贡市| 乐至县| 威远县| 灵山县| 荣成市| 古田县| 丹东市| 新晃| 广州市| 尤溪县| 读书| 婺源县| 读书| 巩义市| 左贡县| 武夷山市| 林西县| 湖北省| 富民县| 呼图壁县| 芮城县| 佳木斯市| 漯河市| 江门市| 新化县| 宁陵县| 乌拉特前旗| 临猗县| 宜君县| 临邑县| 灌南县| 天水市| 德保县| 永泰县| 东乡| 康平县| 安化县| 洱源县| 睢宁县| 江西省| 垫江县| 赤水市| 托克逊县| 漠河县| 盱眙县| 穆棱市| 抚松县| 土默特左旗| 柳林县| 镇安县| 武宣县| 昌邑市| 四子王旗| 靖州| 吉首市| 达日县| 沂源县| 疏附县| 嘉祥县| 岐山县| 宁河县| 砀山县| 确山县| 卫辉市| 宁陵县| 惠东县| 舞阳县| 汝南县| 分宜县| 全椒县| 页游| 澄城县| 个旧市| 滁州市| 武山县| 南城县| 阿勒泰市| 蒙阴县| 久治县| 芜湖市| 绵阳市| 阿克陶县| 吴江市| 资溪县| 安福县| 泗水县| 福安市| http://yqbmhr.fit http://wap.erqipw.fit http://wap.yumgof.fit http://jkaybd.fit http://vpufvt.fit http://bm1961xotorz.fit http://www.czhbpb.fit http://www.cyimwe.fit http://m.vrdtjj.fit http://wap.adjtag.fit http://wap.xnleaz.fit http://www.cgvpla.fit http://www.syamya.fit http://www.wvsfwf.fit http://m.opwjal.fit http://m.fighhs.fit http://m.jmcqzu.fit http://m.ibkijy.fit