5.15 vs2019 静态编译_《淫巧系列一》MATLAB编译exe与生成C++库
软件环境:
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/1LLVabX0NpjaTJ81DeD0Dmgpan.baidu.com
一些重要提示:
注意编译器的版本与MATLAB的版本,不同版本的编译器会链接不同MATLAB静态库(MATLAB 2017后升级很多静态库),可以通过MATLABbinwin64mexopts中xml文件来查看,根据个人环境配置灵活修改。
如果使用的MATLAB是64位的版本,那么C++的程序也要在x64下配置。
如果使用的MATLAB是32位的版本,那么C++的程序也要在win32下配置。
MATLAB是读取连续内存按列存储到矩阵,因此需要注意数据的转换。
5.15 vs2019 静态编译_《淫巧系列一》MATLAB编译exe与生成C++库相关推荐
- 5.15 vs2019 静态编译_Go Web 开发如何优雅的包含静态资源文件?
点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 静态文件,也有人叫资产或资源,是一些被程序使用.没有代码的文件.在 Go 中,这类文件就是非 .go ...
- 5.15 vs2019 静态编译_HPCC S01E01 编译 win10,ubuntu 安装
本文使用 Zhihu On VSCode 创作并发布 首先HPC Challenge的编译需要bash.不能用cmd. ubuntu会自带bash,win10需要另外安装bash,可以使用msys2 ...
- 5.15 vs2019 静态编译_xmake v2.3.8 发布, 新增 Intel C++/Fortran 编译器支持
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...
- java虚拟机编译_[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...
前言简介 前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明 想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是如何编译 ...
- accessibility-service 高版本无法编译_今天我把APP的编译速度缩短了近5倍
原文作者:炸鸡叔 博客:https://juejin.im/post/5cd133af6fb9a0323a01ca84 前言 团队使用kotlin挺长时间了,一直以来都不太满意kotlin的编译速度, ...
- java半解释半编译_编译型语言、解释型语言、半编译半解释型语言
计算机不能直接理解任何除机器语言以外的语言,所以必须要把程序员所写的程序语言翻译成机器语言,计算机才能执行程序.将其他语言翻译成机器语言的工具,被称为编译器. 编译器翻译的方式有两种:一种是编译,一种 ...
- linux下qt静态编译_自由出土文物的空间_百度空间
linux下qt静态编译_自由出土文物的空间_百度空间 linux下qt静态编译_自由出土文物的空间_百度空间 linux下qt静态编译 2012-04-09 13:10 测试通过,贴一下过程,仅用来 ...
- QT5.15.2静态编译MSVC2019
下载源码: 官网:下载地址 腾讯源:下载地址 清华源:下载地址 查看源码编译环境 源码目录中的README文件 Windows: -------- Open a command prompt. ...
- jpa 手动预编译_编译时检查JPA查询
jpa 手动预编译 JPA提供了几种查询数据的方法. 可以根据各种标准(例如,使用的语言(SQL与JPQL)或查询是静态的(编译时间)还是动态的(执行时间))对此类替代方案进行分类. 静态查询是使用@ ...
- java编译_解析 Java 即时编译器原理。
↑ 点击上面 "时代Java"关注我们,关注新技术,学习新知识! 一.导读 常见的编译型语言如C++,通常会把代码直接编译成CPU所能理解的机器码来运行.而Java为了实现&quo ...
最新文章
- HDU - 6305 RMQ Similar Sequence(笛卡尔树)
- 有一台电脑怎么挣钱_大聪明,双十一我想6000元配置一台能畅玩主流游戏的电脑,应该怎么搭配?...
- UA MATH564 概率论 依概率收敛的一个例题
- 串行和并行的区别_入门参考:从Go中的协程理解串行和并行
- 【Android开发】消息处理类(Handler)与消息类(Message)介绍
- android开机自动开启zram,低内存配置 | Android 开源项目 | Android Open Source Project...
- 第72课 函数与最大值-2021.10.15
- 以腾讯云IoT Suite为例 谈谈边缘计算在物联网的实践与实现
- 一次性补缴17万元办社保,每月可以领1400多,可否办理?
- python2.7怎么下载安装_Windows平台下python2.7如何安装Beautiful Soup
- pyspark--用法
- CryptoKitties加密猫合约详解
- 【大数据】Hadoop环境搭建图文教程(VM安装教程+Linux环境下配置+搭建三节点的Hadoop集群)
- 第7章 区块链开发平台:超级账本
- 视频教程-微信公众号二维码签到和抽奖软件-微信开发
- fedora安装 设置基础软件仓库时出错
- win10系统过期或处于通知模式
- android中点击空白处隐藏软键盘
- JavaWeb jQuery
- 2021上岸东南大学网络空间安全学院916学硕心得分享——初试篇