【问题标题】:How to use C++ compiler by Matlab Mex compilation toolMatlab Mex编译工具如何使用C++编译器
【发布时间】:2014-05-29 16:22:33
【问题描述】:

我正在尝试在 Matlab 中构建一个包含 m 文件和 c++ (cpp) 源文件的源代码包。

源文件夹有一个简单的Matlab Script来编译一个文件夹中的所有cpp文件:

function compileDir_simple(Cdir)
if nargin<1
    Cdir=pwd;
end

files = dir(fullfile(Cdir,'*.cpp'));

oldDir=pwd;
cd(Cdir);
for j=1:length(files)
    try
        cm = sprintf('mex -largeArrayDims %s',files(j).name);
        disp(cm);
        eval(cm);
catch
    disp(lasterr);
    disp('IGNORE if the file is a C++ file which is not a mex file (ie without a     mexFunction inside)');
    end
end

cd(oldDir);

在内部,它使用“mex -largeArrayDims”。但是,我的问题是,当我评估该语句时,Matlab 尝试通过包含在 MATLAB 本身中的 C 编译器构建所选文件。当我调用 mex -setup 时,我看到:

墨西哥 - 设置 请选择您的编译器来构建外部接口 (MEX) 文件:

Would you like mex to locate installed compilers [y]/n? y

Select a compiler: 
[1] Lcc-win32 C 2.4.1 in D:\MATLAB\R2010a\sys\lcc 

[0] None 

Compiler: 

我安装了 Bloodshed C++ 编译器并将其 bin 文件夹 ( 添加到 Windows 环境变量中,但我仍然无法在已安装编译器列表中看到我的 C++ 编译器。只有 Lcc-win32 出现。声明它是合适的我第一次编译 mex 文件的经验。

【问题讨论】:

  • 我不想安装 Visual Studio C++(更多下载时间 + 内存需求)并找到一种更简单、更快捷的 C++ 编译方法,而唯一的其他适用于 Windows 的 C++ 编译器是 Dev C++。答案是正确的,它不是 MATLAB 支持的编译器

标签: c++ matlab mex


【解决方案1】:

Windows 上的 mex 文件只是一个导出名为 mexFunction 的函数的 DLL。原则上,您可以使用任何可以创建 Windows DLL 的编译器来编译 mex 文件。

但是,在 MATLAB 中使用 mex 函数执行此操作需要 MATLAB 了解您的编译器。默认情况下,MATLAB 只了解有限数量的编译器。您选择的编译器不是其中之一。

Bloodshed 基于 mingw。这意味着您应该能够使用 Gnumex 项目来创建一个 mexopts.bat 文件以供您的编译器使用。

但是,我对在这里使用 Bloodshed 持怀疑态度。它是一个 C++ IDE,我不确定你是否特别需要它。我怀疑您正在寻找的只是一个编译器。在这种情况下,您可能最好安装普通的 mingw。

【讨论】:

    【解决方案2】:

    Bloodshed C++ 不是受支持的编译器。检查http://www.mathworks.co.uk/support/compilers/R2014a/index.html 以获取支持的编译器列表。旧版本可从同一页面获得。

    【讨论】:

    • mex 文件只是 DLL。几乎任何 Windows 编译器都可以构建一个 mex 文件。甚至不需要用 C 语言编写。
    • @DavidHeffernan 好吧,如果你想在 MATLAB 中运行mex 命令,你需要先运行mex -setup,这需要一个支持的编译器。
    • 这根本不是真的。您几乎可以将任何 C 编译器与 mex 一起使用。例如:gnumex.sourceforge.net/documentation.html
    • @DavidHeffernan 好的,很好,但 MathWorks 没有记录/推荐。我说的是遵循 Mathworks 批准/支持/记录的编译器。要安装、设置和正常工作(对于普通用户而言)其中之一已经够难了,而不必通过使用不受支持/未记录的东西来寻找其他问题。
    • 我同意这一点。我只是想打消任何可能的概念,即只能使用受支持的编译器。
    猜你喜欢
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多