0

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

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

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

 ,,maci
 ........

 ,,maci64
 ......

那么,编译的时候用的是maci还是maci64呢?

为了编译 32 位库而不是 64 位库,我可以执行哪些命令或方式?

对我的过程和我得到的错误消息的进一步解释:我正在使用 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文件夹,是32位的,只有maci文件夹。所以任何人都知道我应该怎么做才能让 matlab 寻找 maci 文件夹而不是 maci64 文件夹?非常感谢!

4

3 回答 3

2

MATLAB不支持MEX 文件的交叉编译。因此,即使操作系统是 64 位,您的 32 位 MATLAB 安装也应该生成 32 位 MEX 文件。

另外,从我链接的文章中

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

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

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

您还可以使用该file工具检查生成的二进制文件是 32 位还是 64 位。

于 2013-05-07T21:09:25.820 回答
1

如前所述,MATLAB 生成的 MEX 文件与其自身的位数相同,而不是操作系统的 MEX 文件。至少在具有最新 MATLAB 版本的 Windows 上是这样,您可以在 64 位 Windows 上运行 32 位或 64 位 MATLAB。其他平台仅64 位版本发展。

这是获取配置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"'
于 2013-05-07T21:34:52.353 回答
0

为了回答我自己的问题,仅供可能对此感兴趣的人使用,

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

于 2013-05-08T17:24:40.937 回答