c - 如何使用 MinGW 为 MATLAB 2011 配置 mex

标签 c matlab gcc mex

我正在运行 64 位 Windows 和 64 位 matlab。按照对 question on stackoverflow 的回答说明进行操作,我尝试配置一个 make 文件来编译我的 C 函数以便在 matlab 中使用。

这是 Makefile 文件:

MINGWPATH=/cygdrive/c/cygwin
CYGPATH=/cygdrive/c/cygwin

MATLABROOT=/cygdrive/c/Progra~1/MATLAB/R2011a
CC=i686-pc-mingw32-gcc
CFLAG= -Wall -m32 -O3 -Iinclude -I$(MATLABROOT)/extern/include $(SRC) $(LIBS) -o $(EXE)
MEXFLAG=-m64 -shared -DMATLAB_MEX_FILE -I$(MATLABROOT)/extern/include -Wl,--export-all-symbols $(LIBS) $(MEXSRC) -o $(MEXTGT).mexw64

LIBS= -Llib -L$(MATLABROOT)/bin/win64 -L$(MATLABROOT)/extern/lib/win64/microsoft -lmex -lmx -lmwlapack -lmwblas -leng
EXE= gopenfunction.exe
MEXTGT= gopenfunction.m
SRC= gopenfunction.c
MEXSRC = gopenfunction.c

all:$(EXE)

$(EXE):  $(SRC)
    $(CC) $(CFLAG) -ladvapi32 -luser32 -lgdi32 -lkernel32 -lmingwex -o $(EXE)

输出

$ make
i686-w64-mingw32-gcc -Wall -m32 -O3 -Iinclude -I/cygdrive/c/Progra~1/MATLAB/R2011a/extern/include gopenfunction.c -Llib -L/cygdrive/c/Progra~1/MATLAB/R2011a/bin/win64 -L/cygdrive/c/Progra~1/MATLAB/R2011a/extern/lib/win64/microsoft -lmex -lmx -lmwlapack -lmwblas -leng -o gopenfunction.exe -ladvapi32 -luser32 -lgdi32 -lkernel32 -lmingwex -o gopenfunction.exe
/cygdrive/c/Progra~1/MATLAB/R2011a/bin/win64/libmex.dll: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status
Makefile:18: recipe for target 'gopenfunction.exe' failed
make: *** [gopenfunction.exe] Error 1

我也试过:

i686-w64-mingw32-gcc -m32 -shared -Iinclude -I"/cygdrive/c/Progra~1/MATLAB/R2011a/extern/include" -DMATLAB_MEX_FILE -o bla.mexw64 -Wl,--export-all-symbols *.c -L"/cygdrive/c/Progra~1/MATLAB/R2011a/bin/win64" -lmex -lmx -leng -lmat

我正在使用 GCC,因为我找不到 VS2008 或 2010,只有 VS Community 2015,当我尝试通过 mex -setup

设置 mex 时,它不起作用

请注意,我从 -m64 更改为 -m32,否则我会收到以下错误。我不完全确定它的作用。

$ i686-w64-mingw32-gcc -m64 -shared -Iinclude -I"/cygdrive/c/Progra~1/MATLAB/R2011a/extern/include" -DMATLAB_MEX_FILE -o bla.mexw64 -Wl,--export-all-symbols *.c -L"/cygdrive/c/Progra~1/MATLAB/R2011a/bin/win64" -lmex -lmx -leng -lmat
gopenfunction.c:1:0: sorry, unimplemented: 64-bit mode not compiled in
 #include "gclibo.h"

Visual Studio 跟进

安装 Microsoft Visual C++ 后,弹出编译器选项但需要 SDK。正在尝试安装 sdk导致错误“必须安装 visual studio 2010”。我还安装了 .NET 4 和 SDK for Windows 7根据 supported compilers for MATLAB 2011 page .

>> mex -setup

Welcome to mex -setup.  This utility will help you set up  
a default compiler.  For a list of supported compilers, see  
http://www.mathworks.com/support/compilers/R2011a/win64.html 

Please choose your compiler for building MEX-files: 

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

Select a compiler: 
[1] Microsoft Visual C++ 2010 Express in C:\Program Files (x86)\Microsoft Visual Studio 10.0\ 

[0] None 

Compiler: 1

Please verify your choices: 

Compiler: Microsoft Visual C++ 2010 Express  
Location: C:\Program Files (x86)\Microsoft Visual Studio 10.0\ 

Are these correct [y]/n? y

***************************************************************************** 
  Error: Microsoft Visual C++ 2010 Express requires the Microsoft Windows 
         Software Development Kit (SDK), but the SDK cannot be found.  
         For more information about the required SDK, see:  
         http://www.mathworks.com/support/compilers/R2011a/win64.html 
***************************************************************************** 

??? Error using ==> mex at 208
Unable to complete successfully.

Cygwin 跟进

我更改了编译器,但现在存在对“WinMain”的 undefined reference 。

$ make
x86_64-w64-mingw32-gcc -Wall -m64 -O3 -Iinclude -I/cygdrive/c/Progra~1/MATLAB/R2011a/extern/include gopenfunction.c -Llib -L/cygdrive/c/Progra~1/MATLAB/R2011a/bin/win64 -L/cygdrive/c/Progra~1/MATLAB/R2011a/extern/lib/win64/microsoft -lmex -lmx -lmwlapack -lmwblas -leng -o gopenfunction.exe -ladvapi32 -luser32 -lgdi32 -lkernel32 -lmingwex -o gopenfunction.exe
/usr/x86_64-w64-mingw32/sys-root/mingw/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o): In function `main':
/usr/src/debug/mingw64-x86_64-runtime-4.0.2-1/crt/crt0_c.c:18: undefined reference to `WinMain'
collect2: error: ld returned 1 exit status
Makefile:18: recipe for target 'gopenfunction.exe' failed
make: *** [gopenfunction.exe] Error 1

编辑 - 使用第二种方法,我能够使用新的 x86_64 编译器进行编译。

x86_64-w64-mingw32-gcc -m64 -shared -Iinclude -I"/cygdrive/c/Progra~1/MATLAB/R2011a/extern/include" -DMATLAB_MEX_FILE -o bla.mexw64 -Wl,--export-all-symbols *.c -L"/cygdrive/c/Progra~1/MATLAB/R2011a/bin/win64" -lmex -lmx -leng -lmat

edit2 - 经过调查,-shared 选项的缺失是导致“WinMain”错误的原因。我真的很感激解释。我对 dll、导入库、共享库等一无所知,除了它们是在运行时使用的。总的来说我的问题已经解决了,感谢大家的帮助。

$ x86_64-w64-mingw32-gcc -m64 -shared -Iinclude -I"/cygdrive/c/Progra~1/MATLAB/R2011a/extern/include" -o bla.mexw64 *.c -L"/cygdrive/c/Progra~1/MATLAB/R2011a/bin/win64" -lmex -lmx -leng -lmat

$ x86_64-w64-mingw32-gcc -m64 -Iinclude -I"/cygdrive/c/Progra~1/MATLAB/R2011a/extern/include" -o bla.mexw64 *.c -L"/cygdrive/c/Progra~1/MATLAB/R2011a/bin/win64" -lmex -lmx -leng -lmat
/usr/x86_64-w64-mingw32/sys-root/mingw/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o): In function `main':
/usr/src/debug/mingw64-x86_64-runtime-4.0.2-1/crt/crt0_c.c:18: undefined reference to `WinMain'
collect2: error: ld returned 1 exit status

edit3 - 查看开头链接的问题中的原始 makefile,以上所有内容都已存在于 $(MEXTGT) 目标下。我只是不明白如何调用或使用它,所以我愚蠢地删除了它。

最佳答案

尽管文件名中有“w64”,i686-w64-mingw32-gcc.exe 生成 32 位二进制文​​件。

要生成 64 位二进制文​​件,请使用 x86_64-w64-mingw32-gcc.exe。在 cygwin 包安装程序中,查找 mingw64-x86_64-。

下面列表中的“mingw64”GCC 工具链。第一个针对 32 位系统,第二个针对 64 位。它们之所以这样命名,是因为它们来自“GCC for Win64”项目(cygwin 是这些工具链的 not the only source)。同时获取 C 工具链(下面未显示)。

enter image description here

此外,根据我对 standalone mingw64 的经验,您可能需要将以下编译器标志添加到您拥有的内容中:

-m64 -mwin32 -mdll ...

而且您确实需要 -shared 作为链接器标志。

关于c - 如何使用 MinGW 为 MATLAB 2011 配置 mex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31574260/

相关文章:

matlab - 在 matlab 中使用 plot3 时如何保存绘图?

c++ - 在 RHEL6 上构建 GCC 5.2

c++ - 错误 'a.out' : free(): invalid next size (normal)

c - 我怎样才能获得哪个变量具有最高值?

matlab - 如何在 MATLAB 中将两个掩码合并在一起?

c - AUTH 命令时 Hotmail/Outlook.com 连接失败

matlab - 如何在 MATLAB 中可视化球体的交点?

c - 存储对变量数组所做的更改

c - uint64_t 到 int

c - Arduino(C语言)解析带分隔符的字符串(通过串口输入)