Mex使用哪个配置选项来使用matlab进行编译?

时间:2013-05-07 20:31:21

标签: matlab mex

说,如果选择mexopts.sh作为mex的配置文件,

那么mex如何决定mexopts.sh中列出的哪个选项用于编译?

例如,在64位mac os x上使用32位matlab: mexopts.sh看起来像:

 ,,maci
 ........

 ,,maci64
 ......

然后,在编译时使用maci或maci64?

为了编译32位lib而不是64位lib,我可以做什么命令或方法?

我的流程和我收到的错误消息的进一步说明: 我使用mac os x 10.8(64位)和matlab R2010a(32位)来生成二进制mex文件。 Xcode是4.6版本,我在我的机器上安装了命令行工具。然后我从matlab下载了2011年和2012年版本的补丁。 (如果我没有安装补丁,我会收到很多链接错误,说缺少一些头文件)。 安装补丁后(我相信它会更改我的mexopts.sh文件),当我运行mex a.cpp时,我收到错误消息,指出无法找到/Applications/MATLAB_R2010a.app/bin/maci64。当然,它找不到maci64文件夹,它是32bit,只有maci文件夹。 所以任何人都知道我应该做什么才能使matlab找到maci文件夹而不是maci64文件夹?非常感谢!

3 个答案:

答案 0 :(得分:2)

MEX文件的MATLAB does not support cross compilation。因此,即使操作系统是64位,您的32位MATLAB安装也应该生成32位MEX文件。

另外,从我链接的文章

  

此外,从R2010b开始,不再为Mac生成32位版本的MATLAB。

如果您正在运行R2010b或更高版本,则无论如何您的MATLAB都不是32位。

要查看MEX脚本调用编译器的switches,请使用-v选项。

您也可以使用file tool to check生成的二进制文件是32位还是64位。

答案 1 :(得分:1)

正如已经解释的那样,MATLAB生成的MEX文件与其本身具有相同的位,而不是OS的文件。至少在具有最新MATLAB版本的Windows上也是如此,您可以在64位Windows上运行32位或64位MATLAB。其他平台仅{64}版本为moving

以下是获取配置的mex开关的另一种方法:

>> cc = mex.getCompilerConfigurations
>> cc.Details

在我的情况下,我得到:

>> cc = mex.getCompilerConfigurations
cc = 
  CompilerConfiguration with properties:

             Name: 'Microsoft Visual C++ 2010'
     Manufacturer: 'Microsoft'
         Language: 'C++'
          Version: '10.0'
         Location: 'C:\Program Files\Microsoft Visual Studio 10.0'
          Details: [1x1 mex.CompilerConfigurationDetails]
       LinkerName: 'Microsoft Visual C++ 2010'
    LinkerVersion: '10.0'
>> cc.Details
ans = 
  CompilerConfigurationDetails with properties:

         CompilerExecutable: 'cl'
              CompilerFlags: [1x115 char]
          OptimizationFlags: '/O2 /Oy- /DNDEBUG'
                 DebugFlags: '/Z7'
           LinkerExecutable: 'link'
                LinkerFlags: [1x327 char]
    LinkerOptimizationFlags: ''
           LinkerDebugFlags: '/debug /PDB:"%OUTDIR%%MEX_NAME%%MEX_EXT%.pdb"'

答案 2 :(得分:0)

回答我自己的问题,仅针对可能对此感兴趣的人,

我检查了mexopts.sh的内容并修改了maci的部分(具体设置为ARCH = i386),然后编译。错误消息消失了。