MATLAB-编译jpeg_read.c来创建mexmaci64文件时出错

问题描述

最近,我将Matlab项目从Windows操作系统迁移到了Mac OS。因此我的jpeg_read.mexw64文件不再起作用,因此我需要创建一个与Mac OS兼容的新的mexmaci64文件。 我从here下载了JpegToolbox,然后使用以下命令安装了Libjpeg:

brew install libjpeg

在Matlab中,我尝试使用mex:

>> mex -setup
MEX configured to use 'Xcode with Clang' for C language compilation.

To choose a different language,select one from the following:
 mex -setup C++ 
 mex -setup FORTRAN
MEX configured to use 'Xcode Clang++' for C++ language compilation.
>> 

但是当我尝试时:

mex -I/usr/local/Cellar/jpeg/9d/include jpeg_read.c -L/usr/local/Cellar/jpeg/9d/lib

Matlab返回以下错误:

Building with 'Xcode with Clang'.
/Users/folder/jpeg_toolbox/jpeg_read.c:294:39: warning: incompatible pointer types passing 'int [2]' to parameter of type 'const mwSize *' (aka 'const unsigned long *') [-Wincompatible-pointer-types]
         mxtemp = mxCreateCharArray(2,dims);
                                      ^~~~
/Applications/Polyspace/R2020a/extern/include/matrix.h:958:91: note: passing argument to parameter 'dims' here
LIBMMWMATRIX_PUBLISHED_API_EXTERN_C mxArray *mxCreateCharArray(mwSize ndim,const mwSize *dims);
                                                                                          ^
1 warning generated.

Error using mex
Undefined symbols for architecture x86_64:
  "_jpeg_CreateDecompress",referenced from:
      _mexFunction in jpeg_read.o
  "_jpeg_destroy_decompress",referenced from:
      _mexFunction in jpeg_read.o
  "_jpeg_finish_decompress",referenced from:
      _mexFunction in jpeg_read.o
  "_jpeg_read_coefficients",referenced from:
      _mexFunction in jpeg_read.o
  "_jpeg_read_header",referenced from:
      _mexFunction in jpeg_read.o
  "_jpeg_save_markers",referenced from:
      _mexFunction in jpeg_read.o
  "_jpeg_std_error",referenced from:
      _mexFunction in jpeg_read.o
  "_jpeg_stdio_src",referenced from:
      _mexFunction in jpeg_read.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
 

现在如何编译该程序?否则,你们中的任何人都已经有了我需要的mexmaci64吗?

解决方法

当MEX文件使用int而不是mwSize作为数组大小时,通常会发生此错误。仍然只有非常旧的MEX文件代码才能做到这一点。

对于这些MEX文件,在编译时需要将-compatibleArrayDims添加到mex命令中。它使编译器选择旧的32位API而不是较新的64位API之一。这确实限制了数组的最大大小,但只能以与写入MEX文件时的限制一致的方式进行。

另一种解决方案是重写MEX文件以使用较新的API。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...