MATLAB - 编译 jpeg_read.c 以创建 mexmaci64 文件时出错
Posted
技术标签:
【中文标题】MATLAB - 编译 jpeg_read.c 以创建 mexmaci64 文件时出错【英文标题】:MATLAB - Error compiling jpeg_read.c to create mexmaci64 file 【发布时间】:2020-11-11 12:34:28 【问题描述】:最近我将我的 Matlab 项目从 windows 操作系统转移到了 Mac 操作系统。所以我的 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?
【问题讨论】:
除了使用@CrisLuengo 的答案中所述的-compatibleArrayDims
之外,您还应该使用-ljpeg
。所以mex 命令将是:mex -compatibleArrayDims -I/usr/local/Cellar/jpeg/9d/include jpeg_read.c -L/usr/local/Cellar/jpeg/9d/lib -ljpeg
非常感谢,我的 jpeg_read 问题刚刚解决。但是 jpeg_write 的 mex 向我显示了一个不同的错误。
【参考方案1】:
当 MEX 文件使用 int
而不是 mwSize
作为数组大小时,通常会发生此错误。只有非常旧的 MEX 文件代码仍然这样做。
对于这些 MEX 文件,您需要在编译时将 -compatibleArrayDims
添加到 mex
命令中。它会导致编译器选择旧的 32 位 API 而不是较新的 64 位 API。这确实限制了数组的最大大小,但仅限于与写入 MEX 文件时的限制一致的方式。
替代解决方案是重写 MEX 文件以使用更新的 API。
【讨论】:
天啊!有效!我一直在寻找 dayyyys 的任何解决方案。非常感谢 Cris 为 jpeg_read 解决了我的问题。但是当我为 jpeg_write 尝试相同的方法时,Matlab 向我显示了另一个错误。我会把它作为答案发布。 我在这里为 jpeg_write 添加了另一个问题:***.com/questions/64792715/…以上是关于MATLAB - 编译 jpeg_read.c 以创建 mexmaci64 文件时出错的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB - 从 jpeg_write.c 创建 maxmaci64 时出错