matlab调用C/C++程序,minGW不支持C++14标准的解决方法

Dev-C++教学环境配置指南:MinGW-w64与C/C++调试实战 C/C++初学者入门常面临编译环境复杂、调试不可见、错误反馈延迟等核心障碍。其本质是开发工具链抽象度过高,导致编译器(如GCC)、调试器(GDB)、标准库(libstdc++)等底层机制难以被直观感知。MinGW-w64作为Windows平台轻量级GNU工具链,凭借零配置集成、SEH异常兼容和POSIX线程支持,成为教学场景的理想载体。它将预处理、编译、链接、调试等过程具象为IDE按钮,显著降低认知负荷。结合-g3调试信息、-O0禁用优化、-std=gnu++17标准指定等关键配置,可支撑从Hello Wo 阅读详情

在matlab里调用c++编写的代码,c++代码里使用了eigen库,eigen库需要c++14以上的编译器,在matlab里编译:

mex CoorTransformer.cpp -IE:\git\eigen

eigen库报matlab所使用的minGW不支持c++14标准,只支持到c++11。

解决方法:

我使用的是MATLAB R2019b,编译选项在C:\Users\Administrator\AppData\Roaming\MathWorks\MATLAB\R2019b\mex_C++_win64.xml

文件中,将其中的"$CFLAGS -std=c++11"修改为"$CFLAGS -std=c++14"即可。

minGW是matlab给的链接里下的:https://ww2.mathworks.cn/matlabcentral/fileexchange/52848-matlab-support-for-mingw-w64-c-c-compiler

附上测试代码:
 

#include "CoorTransformer.h"
#include <iostream>
#include <Eigen/Dense>
#include <Eigen/Geometry>
#include "mex.h"


using namespace std;
/**
 * CoorTransformer implementation
 */

Interpolation::Interpolation()
{

}

void Interpolation::interpolate(const float q1w, const float q1x, const float q1y, const float q1z, const float p1x, const float p1y, const float p1z,
                                const float q2w, const float q2x, const float q2y, const float q2z, const float p2x, const float p2y, const float p2z,
                                float &q3w, float &q3x, float &q3y, float &q3z, float &p3x, float &p3y, float &p3z,
                                float scalar)
{
    // 插值四元数
    Eigen::Quaterniond point1_q(q1w, q1x, q1y, q1z);
    point1_q.normalize();

    Eigen::Quaterniond point2_q(q2w, q2x, q2y, q2z);
    point2_q.normalize();

    Eigen::Quaterniond inter_q(1, 0, 0, 0);
    inter_q = point1_q.slerp(scalar, point2_q);
    inter_q.normalize();
    mexPrintf("point1 q normalize: %f %f %f %f\n", point1_q.w(), point1_q.x(), point1_q.y(), point1_q.z());
    mexPrintf("point2 q normalize: %f %f %f %f\n", point2_q.w(), point2_q.x(), point2_q.y(), point2_q.z());
    mexPrintf("inter q normalize: %f %f %f %f\n", inter_q.w(), inter_q.x(), inter_q.y(), inter_q.z());

    // 插值位置
    const Eigen::Vector3d point1_p(p1x, p1y, p1z);
    const Eigen::Vector3d point2_p(p2x, p2y, p2z);
    Eigen::Vector3d inter_p(0, 0, 0);
    inter_p = (point2_p - point1_p) * scalar + point1_p;
    mexPrintf("point1 p normalize: %f %f %f\n", point1_p.x(), point1_p.y(), point1_p.z());
    mexPrintf("point2 p normalize: %f %f %f\n", point2_p.x(), point2_p.y(), point2_p.z());
    mexPrintf("inter p normalize: %f %f %f\n", inter_p.x(), inter_p.y(), inter_p.z());

    // 输出插值
    q3w = inter_q.w();
    q3x = inter_q.x();
    q3y = inter_q.y();
    q3z = inter_q.z();
    p3x = inter_p.x();
    p3y = inter_p.y();
    p3z = inter_p.z();
}

// MEX函数
/* 在matlab上调用方式为:[q3w,q3x,q3y,q3z,p3x,p3y,p3z] = CoorTransformer(q1w,q1x,q1y,q1z,p1x,p1y,p1z,q2w,q2x,q2y,q2z,p2x,p2y,p2z,0.5)
输入15个参数,输出7个参数
*/
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    mexPrintf("input number: %d\n", nrhs);
    mexPrintf("output number: %d\n", nlhs);

    // input
    float q1w = *(mxGetPr(prhs[0]));
    float q1x = *(mxGetPr(prhs[1]));
    float q1y = *(mxGetPr(prhs[2]));
    float q1z = *(mxGetPr(prhs[3]));
    float p1x = *(mxGetPr(prhs[4]));
    float p1y = *(mxGetPr(prhs[5]));
    float p1z = *(mxGetPr(prhs[6]));
    float q2w = *(mxGetPr(prhs[7]));
    float q2x = *(mxGetPr(prhs[8]));
    float q2y = *(mxGetPr(prhs[9]));
    float q2z = *(mxGetPr(prhs[10]));
    float p2x = *(mxGetPr(prhs[11]));
    float p2y = *(mxGetPr(prhs[12]));
    float p2z = *(mxGetPr(prhs[13]));
    float scalar = *(mxGetPr(prhs[14]));

    mexPrintf("input1: (%f %f %f %f)(%f %f %f)\n", q1w, q1x, q1y, q1z, p1x, p1y, p1z);
    mexPrintf("input2: (%f %f %f %f)(%f %f %f)\n", q2w, q2x, q2y, q2z, p2x, p2y, p2z);

    float q3w;
    float q3x;
    float q3y;
    float q3z;
    float p3x;
    float p3y;
    float p3z;

    Interpolation intp;
    intp.interpolate(q1w, q1x, q1y, q1z, p1x, p1y, p1z,
                     q2w, q2x, q2y, q2z, p2x, p2y, p2z,
                     q3w, q3x, q3y, q3z, p3x ,p3y, p3z, scalar);

    // output
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
    *(mxGetPr(plhs[0])) = q3w;
    plhs[1] = mxCreateDoubleMatrix(1, 1, mxREAL);
    *(mxGetPr(plhs[1])) = q3x;
    plhs[2] = mxCreateDoubleMatrix(1, 1, mxREAL);
    *(mxGetPr(plhs[2])) = q3y;
    plhs[3] = mxCreateDoubleMatrix(1, 1, mxREAL);
    *(mxGetPr(plhs[3])) = q3z;
    plhs[4] = mxCreateDoubleMatrix(1, 1, mxREAL);
    *(mxGetPr(plhs[4])) = p3x;
    plhs[5] = mxCreateDoubleMatrix(1, 1, mxREAL);
    *(mxGetPr(plhs[5])) = p3y;
    plhs[6] = mxCreateDoubleMatrix(1, 1, mxREAL);
    *(mxGetPr(plhs[6])) = p3z;

    mexPrintf("output: (%f %f %f %f)(%f %f %f)\n", q3w, q3x, q3y, q3z, p3x, p3y, p3z);
}

在matlab里执行:

mex -setup C++

mex CoorTransformer.cpp -IE:\git\eigen

q1w=0.9659;
q1x=0;
q1y=0;
q1z=0.2588;
p1x=100;
p1y=200;
p1z=300;
q2w=0.866;
q2x=0;
q2y=0;q2z=0.5;
p2x=200;
p2y=300;
p2z=400;
q3w=0;
q3x=0;
q3y=0;
q3z=0;
p3x=0;
p3y=0;
p3z=0;

[q3w,q3x,q3y,q3z,p3x,p3y,p3z] = CoorTransformer(q1w,q1x,q1y,q1z,p1x,p1y,p1z,q2w,q2x,q2y,q2z,p2x,p2y,p2z,0.2);

可以得到正确结果:

>> [q3w,q3x,q3y,q3z,p3x,p3y,p3z] = CoorTransformer(q1w,q1x,q1y,q1z,p1x,p1y,p1z,q2w,q2x,q2y,q2z,p2x,p2y,p2z,0.2);
input number: 15
output number: 7
input1: (0.965900 0.000000 0.000000 0.258800)(100.000000 200.000000 300.000000)
input2: (0.866000 0.000000 0.000000 0.500000)(200.000000 300.000000 400.000000)
point1 q normalize: 0.965929 0.000000 0.000000 0.258808
point2 q normalize: 0.866019 0.000000 0.000000 0.500011
inter q normalize: 0.951059 0.000000 0.000000 0.309010
point1 p normalize: 100.000000 200.000000 300.000000
point2 p normalize: 200.000000 300.000000 400.000000
inter p normalize: 120.000000 220.000000 320.000000
output: (0.951059 0.000000 0.000000 0.309011)(120.000000 220.000000 320.000000)

Code::Blocks缺失C++11/14/17编译选项?手把手教你配置MinGW-w64编译器 在C++开发中,编译器是将源代码转换为可执行程序的核心工具,其版本和配置直接决定了支持的C++语言标准(如C++11、C++14、C++17)。现代C++标准引入了自动类型推导、Lambda表达式、智能指针等关键特性,极大地提升了开发效率和代码安全性。对于使用Code::Blocks这类轻量级IDE的开发者而言,IDE本身不负责编译,其功能菜单(如C++标准选项)是动态读取并展示底层编译器(如GCC、MSVC、Clang)能力的结果。因此,当遇到IDE中缺失现代C++编译选项时,其技术根源通常指向编译器环境 阅读详情

相关推荐

Code::Blocks+MinGW:C/C++教学环境配置与编译原理实践指南

C/C++编程入门的核心在于理解编译过程与工具链协同机制,而非仅掌握语法。Code::Blocks作为轻量级IDE,其价值源于对GCC编译流程的透明暴露——从预处理、编译、汇编到链接,每一步都可在Build Log中直观验证,天然契合《编译原理》基础教学需求。结合MinGW-w64工具链,它提供开箱即用的Windows本地编译能力,规避VS Code等现代IDE因环境配置复杂导致的‘头文件找不到’‘调试器无法附加’等高频故障。该组合特别适用于高校机房批量部署、算法实验、指针与内存可视化教学等强实践场景,是连

weixin_33863087的博客 340

(史上最全解决方法,学不会算我输~) 从0安装MinGW32/64 ,Matlab错误使用mex未找到支持的编译器或SDK解决办法

MinGW安装,MATLAB安装过程或使用过程中的错误解决

xuanhaolaile的博客 8045

llama.cpp核心原理:C/C++ CPU推理与GGUF模型格式深度解析

大语言模型(LLM)本地化部署的核心挑战在于运行时确定性、内存可控性与跨平台兼容性。传统Python框架受限于解释器开销、GC不确定性及CUDA绑定,难以满足边缘设备、嵌入式系统和工业实时场景的严苛要求。llama.cpp以纯C/C++实现,通过零依赖构建、显式内存管理与硬件亲和设计,重构了CPU推理的技术范式;其配套的GGUF模型格式本质是内存映射协议,支持mmap零拷贝加载、量化内核直通与多后端统一抽象。结合CMake驱动的硬件能力探测与条件编译,该技术栈已成为轻量级、可审计、可嵌入的大模型落地事实标准

weixin_33676492的博客 432

MATLAB输入mex -setup显示未找到支持的MinGW-w64 C/C++编译器。但是安装了MinGW-w64编译器后问题依然存在

mex在2016里面怎么都玩不转;改了环境变量、安装了MinGW工具、更新了./bin/win64/mexopts路径下的.xml文件不能解决问题;后来发现在2018里面可以直接运行,闹了个大乌龙,也不知道是不是我之前的安装起了作用,记录一下吧。后来发现是我电脑内安装了两个版本的Matlab,一个R2018b一个R2016a,之前一直习惯用2016,安装两个版本并不是脑子抽了,安装2018主要是用来满足猎奇心理但是一直没有卸载,言归正传。网上找了各种大神的帖子和解决方案,但是都没能解决问题;

Quoten的博客 874

Code::Blocks+MinGW教学环境配置与编译原理实践指南

C语言教学环境的核心需求是轻量、确定、透明——这正是Code::Blocks与MinGW组合不可替代的技术逻辑。作为面向初学者的编程教具,它不隐藏编译四阶段(预处理、编译、汇编、链接),不抽象工具链路径,也不绑架项目结构,使学生能直观理解gcc调用机制、GDB内存调试原理及UTF-8中文编码全流程。其开箱即用的MinGW集成包规避了VS Code等现代IDE在c_cpp_properties.json配置、PATH环境变量、IntelliSense索引等方面的认知过载,真正将学习焦点回归指针、内存布局与函数

weixin_30729609的博客 426

MATLAB实战指南:从环境配置到App开发,解决高频痛点问题

在科学计算与工程仿真领域,MATLAB作为一款强大的交互式环境,其核心价值在于将复杂的数学模型和算法转化为可执行的计算流程。其工作原理基于矩阵运算和函数库调用,通过高效的数值计算引擎和丰富的工具箱,为算法开发、数据分析和系统建模提供了统一平台。这一技术特性使其在信号处理、图像分析、控制系统设计等场景中不可或缺。然而,实际应用中,环境配置、编译器集成和图形渲染等底层问题常成为障碍,直接影响开发效率。例如,MEX编译器的正确配置是调用C/C++代码、提升性能的关键,而OpenGL图形警告则关乎可视化流畅度与仿真

weixin_30629653的博客 349

MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本

而且,给一个程序开发图形用户界面,是一件非常麻烦的事情,因为它是与平台紧密相关的,你要考虑各个平台的不同。如果代码没有明显的编译错误,运行时也没有逻辑错误,则在最终编译为可发布版的程序时,我们还要考虑编译优化的问题,以便生成的程序文件拥有更小的体积,和更高的运行效率。说明:bin 文件夹下包含了很多后缀名是 .exe 的可执行程序,这些就是开发时所需的工具,如:gcc.exe 是用来编译 C程序的,g++.exe 是用来编译 C++ 程序的,而 gdb.exe 则是用来调试程序的 debug 工具。

yygr的博客 1万+

C++项目集成matio库:跨平台读写MATLAB .mat文件完整指南

在科学计算与机器学习领域,数据交换与跨平台处理是核心需求。MATLAB的.mat文件作为一种通用数据容器,广泛存储着矩阵、结构体等复杂数据。为了实现C/C++生态与MATLAB数据格式的无缝对接,需要借助专门的读写库进行数据格式转换与内存映射。matio库作为一个轻量级、跨平台的C语言库,正是为解决这一鸿沟而生。它通过解析MAT文件版本、提供数据类型转换层,将MATLAB的多维数组、稀疏矩阵等数据结构精准翻译为C语言内存结构,反之亦然,其技术价值在于为算法移植、跨平台数据流水线及嵌入式系统中处理预训练模型参

weixin_30482181的博客 418

linux如何查看编译器支持的C++版本(支持C++11、支持C++14、支持C++17、支持C++20)(编译时不指定g++版本,默认使用老版本编译)g++版本、gcc版本、ubuntu版本

如果命令行没有输出,则说明您的系统支持C++11。如果输出了错误信息,则说明您的系统不支持C++11。C++11是一个重要的C++标准版本,于2011年发布。这行代码是使用g++编译器来编译一段简单的C++代码,以检查您的系统是否支持C++11。(136盒子 ubuntu16.04 gcc5.4.0)(浪潮服务器ubuntu20.04 gcc9.4.0)上面都是支持情况的打印,如果不支持,会提示什么呢?选项告诉编译器使用C++11标准编译代码。,以便编译器不必读取任何输入。如图,这个环境不支持C++20。

Dontla的博客 3万+

MATLAB R2024b AI新特性:PyTorch模型无缝集成与边缘部署实战

深度学习模型部署是AI工程化落地的关键环节,其核心在于实现训练框架与生产环境的高效衔接。ONNX作为开放的模型交换标准,为不同框架间的模型迁移提供了通用桥梁,有效解决了框架生态割裂的问题。在工程实践中,将PyTorch等主流框架训练的模型部署到资源受限的边缘设备(如树莓派)是一大挑战,通常涉及模型转换、优化和轻量化推理。MATLAB R2024b通过引入`pytorchModel`函数和增强的Deep Learning Toolbox Converter,显著简化了这一流程。新特性允许开发者在不脱离MATL

weixin_30700977的博客 485

MATLAB Central高效使用指南:从安装配置到算法仿真的核心技巧

在科学计算与工程仿真领域,掌握核心工具的高效使用方法是提升生产力的关键。MATLAB作为广泛使用的技术计算环境,其强大的矩阵运算能力和丰富的工具箱为算法实现、系统仿真和数据分析提供了坚实基础。理解软件的原理,如向量化编程和图形渲染机制,能显著提升代码执行效率和可视化质量。这些技术的核心价值在于将复杂的数学建模过程抽象化、自动化,从而加速从理论到原型的验证周期。在实际应用场景中,无论是进行OFDM通信系统仿真、信号处理实验,还是处理图形渲染警告等常见问题,一个稳定且高效的工作环境都至关重要。本文围绕MATLA

weixin_30897233的博客 405

错误分析-C++调用MATLAB库函数报LNK2019错误

1.问题描述:C++调用MATLAB编译生成的库函数时,报LNK2019错误 2.错误展示: 错误 1 error LNK2019: 无法解析的外部符号 _Date_translateInitialize,该符号在函数 _main 中被引用 D:\code\C\scanMode\scanMode\ScanMode.obj scanMode 3.解决方法: 检查项目平台...

weixin_36377461的博客 794

GCC MingGW-w64 8.1安装调试

和STM32同宗:​ 你给STM32编译代码的那个工具(arm-none-eabi-gcc),也是GCC家族的。💡 如果你以后确实有"要 GCC 15 + pacman 装库"的需求,正确姿势是再装一份独立的 MinGW(或 MSYS2)并存,别动 MATLAB 这一份。次选 MinGW-w64:​ 如果你只是单纯地在VSCode里写点纯C代码,不想装庞大的Visual Studio,那用MinGW-w64很轻便。跨平台:​ 你在Windows上用它写的代码,拿到Linux上,用GCC还能接着用。

The @MMiL algoDves & programming space 103

MATLAB调用C++代码实战:用TDM-GCC替代MinGW的正确姿势

本文详细介绍了如何在MATLAB中使用TDM-GCC替代MinGW来编译C++代码的正确方法。通过对比TDM-GCC与MinGW的兼容性和性能优势,提供从安装配置到环境变量设置的完整步骤,帮助开发者解决MATLAB调用C++代码时的常见问题,实现高效编译与集成。

d6e7f8的博客 909

TDM-GCC编译器安装与MATLAB MEX文件配置实战

TDM-GCC的安装看似简单,实则处处是坑。但从另一个角度看,正是这些细节决定了你能否顺利进入高性能计算的大门。记住一句话:好的工具链不是“能用就行”,而是“稳定、可控、可复现”。当你有一天需要在服务器上批量部署MEX模块,或者给学生发一份标准化开发环境时,你会发现今天花在这篇文章上的每一分钟,都是值得的。最后送大家一句我常说的话:🔧 “不要怕折腾编译器,它折腾你的次数只会更多。祝你编译顺利,模型飞快!🔥本文还有配套的精品资源,点击获取。

weixin_35950531的博客 985

Dify + mem0插件实战:如何让AI记住你的饮食习惯(附完整代码)

本文通过Dify平台与mem0插件实战,详细演示了如何为AI助手构建长期记忆系统,使其能记住并理解用户的复杂饮食习惯(如过敏源、饮食偏好)。文章提供了完整的工作流配置与Python代码示例,帮助开发者实现跨会话的个性化饮食建议,解决AI对话中的“健忘”问题。

lg888的博客 1094

MATLAB在Mac OS X Snow Leopard上的兼容性挑战与实战解决方案

科学计算软件在老旧操作系统上的部署常面临核心依赖兼容性问题,这涉及底层库版本、图形系统接口和编译器工具链的匹配。以MATLAB在Mac OS X Snow Leopard(10.6)上的安装为例,其关键在于处理64位图形安装器与X11图形服务器的缺失,以及配置Mingw-w64编译器以支持MEX功能。这些挑战反映了商业软件快速迭代与多样化生产环境间的普遍矛盾。通过系统性地解决X11环境变量设置、OpenGL渲染模式调整及编译器路径配置,用户可以在老旧硬件上构建稳定的计算环境。这种实践不仅适用于特定版本的MA

weixin_33712987的博客 428

VSCode玩转STM32:手把手教你配置EIDE插件与OpenOCD调试(附野火DAP配置文件详解)

本文详细介绍了如何在VSCode中配置EIDE插件与OpenOCD进行STM32开发,特别针对野火DAP调试器提供了配置文件详解。从基础环境搭建到深度调试技巧,帮助开发者高效完成STM32项目开发,实现现代化嵌入式开发工作流。

weixin_26905487的博客 553

MATLAB社区年度规划:从环境配置到专业仿真的全链路实践指南

在工程计算与科学仿真领域,MATLAB作为核心工具,其应用涵盖从基础算法开发到复杂系统建模的全过程。理解其工作原理,关键在于掌握软件环境配置、核心函数库调用以及与其他工具的集成机制。这一技术栈的价值在于能够显著提升科研与工程效率,将数学模型快速转化为可视化结果和可执行代码。其典型应用场景包括信号处理、控制系统设计、图像分析以及通信系统仿真等具体工程问题。本文基于MATLAB社区的实际需求,聚焦高频技术痛点,例如MinGW-w64编译器的集成配置与OpenGL图形渲染警告的排查,深入解析环境搭建中的常见障碍与

weixin_30723433的博客 464

STM32解析航模遥控器的PPM信号

使用STM32对航模遥控器的PPM信号进行解析

qq_44343584的博客 9734

SRAM Bank数量配置:性能、面积与功耗的权衡指南

SRAM(静态随机存取存储器)是芯片设计中的关键存储单元,其Bank数量配置直接影响访问延迟、吞吐率、功耗和面积。Bank切分通过将存储阵列分区,缩短位线和字线延迟,从而提升性能,但会增加外围电路开销。合理配置Bank数量可优化PPA(性能、功耗、面积),在28nm和16nm工艺下,2个Bank通常是性价比最高的选择。本文基于实测数据,探讨不同场景下的Bank配置策略,帮助工程师避免常见误区,提升设计效率。

weixin_27230891的博客 179

MATLAB R2009b 安装配置与兼容性实战指南

在软件工程与科学计算领域,版本兼容性与技术债务管理是长期存在的核心挑战。其原理在于,软件生态的迭代往往导致旧有代码、编译环境与依赖库在新平台上失效,尤其涉及特定硬件接口或数值计算精度时。解决这类问题的技术价值在于保障关键工业仿真、学术研究及遗留系统的连续性与结果可复现性,避免因升级引发的不可控风险与高昂验证成本。应用场景广泛覆盖航空航天、汽车控制、工业自动化等对稳定性要求极高的领域,其中 MATLAB 作为重要的工程计算平台,其历史版本(如 R2009b)的部署常面临安装介质获取、编译器配置、许可证激活等具

culi3118的博客 520

病理WSI配准库valis教程

病理WSI配准库valis教程

azrealq的博客 2598
上一篇: ModuleNotFoundError: No module named ‘Crypto‘
下一篇: ABB机器人RobotStudio6.08添加外部轴(验证可用,详细记录每个步骤)
ifreecoding
博客等级 码龄15年 148粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值