软件环境:

windows 10

MATLAB 2016a

Visual Studio 2019

设置MATLAB中的C++编译器:

在MATLAB中输入:

mex -setup

选择MSVC编译器,如果找不到编译器可以输入一下命令查找支持的编译器版本:

mex -setup -v

或进入MATLAB目录中的binwin64mexopts中查看支持的编译器xml文件,找不到当前系统的编译器可以进入MATLAB官网下载对应的编译器的xml文件,如VS2019的编译器文件下载地址:

https://www.mathworks.com/matlabcentral/answers/uploaded_files/220928/MATLAB%20VS2019%20Support.zip

将下图两个文件复制到binwin64mexopts中,并打开注册表,在注册表内找到

 计算机HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftVisualStudioSxSVS7,

没有就在相应目录下创建对应项,在该目录下创建“16.0”的字符串,将“ Visual Studio”安装目录的地址赋值给它,如下图:

之后重新在MATLAB中输入“mex -setup”应该就能找到对应的编译器。

MATLAB生成EXE文件

在MATLAB输入命令

deploytool

选择第一项即是编译生成EXE文件

选择需要编译的m文件,当需用执行EXE的电脑中已经有了MATLAB的运行环境可以选红色框的选项,否则建议选择下面一项,会将编译出EXE所需要的运行环境一起打包起来,供使用者安装。

编译好了生成三个文件夹:

  • for_redistribution包含用于安装应用程序和MATLAB Runtime的文件;
  • for_testing文件夹包含创建的所有由MCC创建的文件,像二进制文件和jar,头和源文件,使用这些文件来测试安装;
  • for_redistribution_files_only文件夹包含应用程序的重新发布所需的文件。这些文件可以分发到那些有MATLAB或者有 MATLAB Runtime 的用户的电脑上;
  • PackagingLog.txt是由编译器生成的日志文件;

进入for_redistribution_files_only目录双击 exe 文件查看结果:

MATLAB生成C++库

在MATLAB中创建一个简单的函数,功能两个矩阵相加:

function out = addMatFunc(input_1,input_2 )out = input_1 + input_2;
disp(out)end

输入“deploytool”选择第三项

选择需要编译的m文件,选择编译为C++库:

若生成失败:

报错内容: fatal error LINK1181: 无法打开输入文件“libMatlabDataArray.lib”;则需要进入 MATLABbinwin64mexopts 目录中修改编译器xml文件,以msvcpp2019.xml为例:

将第49行、78行与79行分别替换为下面的内容:

49:LINKLIBS="/LIBPATH:"$MATLABROOTexternlib$ARCHmicrosoft" libmx.lib libmex.lib libmat.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib"
78:LINKFLAGS="/nologo /manifest"
79:LINKLIBS="/MACHINE:AMD64 /LIBPATH:"$MATLABROOTexternlib$ARCHmicrosoft" mclmcrrt.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib"

重新编译m文件。

编译成功后在for_redistribution_files_only中可以看到生成了对应的头文件、静态库文件与动态库文件。

最后,配置C++工程,在C++中调用生成的库。 将生成的.dll、.lib、.h文件复制到C++工程目录下:

注意:如果使用的MATLAB是64位的版本,那么C++的程序也要在x64下配置。如果使用的MATLAB是32位的版本,那么C++的程序也要在win32下配置。

VS中配置头文件路径与链接库路径:

编写C++代码,mwArray为MATLAB所支持的数据格式,其可以通过指针来赋值,注意:MATLAB是读取连续内存按列存储到矩阵,因此需要注意数据的转换!!

// funcTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include"addMatFunc.h"using namespace std;
#pragma comment(lib, "./addMatFunc.lib" )#define WIDTH 20
#define HEIGHT 20int main()
{double* input_1 = new double[WIDTH * HEIGHT];double* input_2 = new double[WIDTH * HEIGHT];double* output = new double[WIDTH * HEIGHT];// 初始化矩阵:input_1 input_2均为20*20的矩阵for (int i = 0; i < HEIGHT; i++) {for (int j = 0; j < WIDTH; j++) {input_1[i * HEIGHT + j] = i;input_2[i * HEIGHT + j] = 1;}}//初始化MATLABaddMatFuncInitialize();// 声明与MATLAB支持的mwArray变量mwArray input_array_1(HEIGHT, WIDTH, mxDOUBLE_CLASS, mxREAL);mwArray input_array_2(HEIGHT, WIDTH, mxDOUBLE_CLASS, mxREAL);mwArray output_array(HEIGHT, WIDTH, mxDOUBLE_CLASS, mxREAL);// 赋值input_array_1.SetData(input_1, HEIGHT * WIDTH);input_array_2.SetData(input_2, HEIGHT * WIDTH);// 函数的输出变量数目int nargout = 1;// 执行MATLAB编译的库函数addMatFunc(nargout, output_array, input_array_1, input_array_2);// 获取输出,写入output的指针中output_array.GetData(output, HEIGHT * WIDTH);// 结束addMatFuncTerminate();return 0;
}

编译并运行工程可以得到结果:

用VS查看 output 指针指向的内存:与打印的结果一致,成功实现在C++中调用MATLAB生成的库函数。

MATLAB代码与C++工程文件网盘链接,提取码2ywc

https://pan.baidu.com/s/1LLVabX0NpjaTJ81DeD0Dmg​pan.baidu.com

一些重要提示:

注意编译器的版本与MATLAB的版本,不同版本的编译器会链接不同MATLAB静态库(MATLAB 2017后升级很多静态库),可以通过MATLABbinwin64mexopts中xml文件来查看,根据个人环境配置灵活修改。

如果使用的MATLAB是64位的版本,那么C++的程序也要在x64下配置。

如果使用的MATLAB是32位的版本,那么C++的程序也要在win32下配置。

MATLAB是读取连续内存按列存储到矩阵,因此需要注意数据的转换。

5.15 vs2019 静态编译_《淫巧系列一》MATLAB编译exe与生成C++库相关推荐

  1. 5.15 vs2019 静态编译_Go Web 开发如何优雅的包含静态资源文件?

    点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 静态文件,也有人叫资产或资源,是一些被程序使用.没有代码的文件.在 Go 中,这类文件就是非 .go ...

  2. 5.15 vs2019 静态编译_HPCC S01E01 编译 win10,ubuntu 安装

    本文使用 Zhihu On VSCode 创作并发布 首先HPC Challenge的编译需要bash.不能用cmd. ubuntu会自带bash,win10需要另外安装bash,可以使用msys2 ...

  3. 5.15 vs2019 静态编译_xmake v2.3.8 发布, 新增 Intel C++/Fortran 编译器支持

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...

  4. java虚拟机编译_[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...

    前言简介 前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明 想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是如何编译 ...

  5. accessibility-service 高版本无法编译_今天我把APP的编译速度缩短了近5倍

    原文作者:炸鸡叔 博客:https://juejin.im/post/5cd133af6fb9a0323a01ca84 前言 团队使用kotlin挺长时间了,一直以来都不太满意kotlin的编译速度, ...

  6. java半解释半编译_编译型语言、解释型语言、半编译半解释型语言

    计算机不能直接理解任何除机器语言以外的语言,所以必须要把程序员所写的程序语言翻译成机器语言,计算机才能执行程序.将其他语言翻译成机器语言的工具,被称为编译器. 编译器翻译的方式有两种:一种是编译,一种 ...

  7. linux下qt静态编译_自由出土文物的空间_百度空间

    linux下qt静态编译_自由出土文物的空间_百度空间 linux下qt静态编译_自由出土文物的空间_百度空间 linux下qt静态编译 2012-04-09 13:10 测试通过,贴一下过程,仅用来 ...

  8. QT5.15.2静态编译MSVC2019

    下载源码: 官网:下载地址 腾讯源:下载地址 清华源:下载地址 查看源码编译环境 源码目录中的README文件 Windows:    -------- Open a command prompt. ...

  9. jpa 手动预编译_编译时检查JPA查询

    jpa 手动预编译 JPA提供了几种查询数据的方法. 可以根据各种标准(例如,使用的语言(SQL与JPQL)或查询是静态的(编译时间)还是动态的(执行时间))对此类替代方案进行分类. 静态查询是使用@ ...

  10. java编译_解析 Java 即时编译器原理。

    ↑ 点击上面 "时代Java"关注我们,关注新技术,学习新知识! 一.导读 常见的编译型语言如C++,通常会把代码直接编译成CPU所能理解的机器码来运行.而Java为了实现&quo ...

最新文章

  1. HDU - 6305 RMQ Similar Sequence(笛卡尔树)
  2. 有一台电脑怎么挣钱_大聪明,双十一我想6000元配置一台能畅玩主流游戏的电脑,应该怎么搭配?...
  3. UA MATH564 概率论 依概率收敛的一个例题
  4. 串行和并行的区别_入门参考:从Go中的协程理解串行和并行
  5. 【Android开发】消息处理类(Handler)与消息类(Message)介绍
  6. android开机自动开启zram,低内存配置  |  Android 开源项目  |  Android Open Source Project...
  7. 第72课 函数与最大值-2021.10.15
  8. 以腾讯云IoT Suite为例 谈谈边缘计算在物联网的实践与实现
  9. 一次性补缴17万元办社保,每月可以领1400多,可否办理?
  10. python2.7怎么下载安装_Windows平台下python2.7如何安装Beautiful Soup
  11. pyspark--用法
  12. CryptoKitties加密猫合约详解
  13. 【大数据】Hadoop环境搭建图文教程(VM安装教程+Linux环境下配置+搭建三节点的Hadoop集群)
  14. 第7章 区块链开发平台:超级账本
  15. 视频教程-微信公众号二维码签到和抽奖软件-微信开发
  16. fedora安装 设置基础软件仓库时出错
  17. win10系统过期或处于通知模式
  18. android中点击空白处隐藏软键盘
  19. JavaWeb jQuery
  20. 2021上岸东南大学网络空间安全学院916学硕心得分享——初试篇

热门文章

  1. ubuntu处理视频 将视频转换成图片帧
  2. 微信小程序弹窗有输入框且可以使用名文和密文输入
  3. SIM868硬件设计学习(一)
  4. 2017最新版《土地利用现状分类》GBT 21010-2017‰
  5. oracle获取字符的长度的函数,oracle取字符串长度的函数length()和hengthb()
  6. 一名软件测试工程师的日常
  7. 基于51单片机的红外计数器proteus仿真 LCD1602显示原理图程序设计
  8. Python 办公自动化之全网最强最详细PDF 文件操作手册
  9. ShaderForge - 纹理水平垂直翻转
  10. 深刻分析有效值与均方根