首页 > 解决方案 > 更新的包,现在用 -O0 编译的 Mex 文件是“无效的 mex 文件”?

问题描述

我有一组(以前工作和编译了几个月)MEX 文件。我用 pacman -Syu 更新了我 3 个月大的软件包(之前使用 GCC/G++ 运行良好),现在这是我的结果:

对于GCC/G++

对于Clang

对于TDM-GCC

操作系统:Win 10,最新更新

语言:C++03

MATLAB 版本:R2016B(没有更新 7,虽然经过测试,但没有帮助)

(更改 C++ 或 MATLAB 版本不是一种选择,这是客户要求)

MINGW64 GCC 版本:9.2.0

TDM GCC 版本:5.1.0-2

目前编译mex不是一个选项。(我在这里发了一篇关于它的新帖子)

以下是制作 c++ 目标文件时的样子:

g++ -c -IC:/Progra~1/MATLAB/R2016b/extern/include -I(some library we made) -g3 -O0 -m64 -DFLIP_MEX_DEBUG=1 -DFLIP_C -ansi -Wshadow -Wall -DMX_COMPAT_32 -DMATLAB_MEX_FILE -fexceptions -fno-omit-frame-pointer -D__WIN32__ myFile.cpp -o myFile.o

下面是 C 目标文件的样子:

gcc -c -IC:/Progra~1/MATLAB/R2016b/extern/include -I(some library we made) -g3 -O0 -m64 -DFLIP_MEX_DEBUG=1 -DFLIP_C -ansi -Wshadow -Wall -DMX_COMPAT_32 -DMATLAB_MEX_FILE -fexceptions -fno-omit-frame-pointer -D__WIN32__ myFile2.c -o myFile2.o

以下是从该目标文件生成 MEX 文件时的样子:

g++ -m64 -shared -Wl,-Bsymbolic -Wl,--no-undefined -Wl,C:/Progra~1/MATLAB/R2016b/extern/lib/win64/mingw64/exportsmexfileversion.def -o myFile.mexw64 myFile.o (various .o files linked in here) -pthread -LC:/Progra~1/MATLAB/R2016b/bin/win64 -LC:/Progra~1/MATLAB/R2016b/extern/lib/win64/mingw64 -lmex -lmx

mex我注意到命令尝试的内容和我们所做的事情有以下差异:

目标文件的区别:

mex 文件的区别:

晦涩难懂的编译器问题不是我的专长。有人对这里可能出现的问题有任何建议吗?

标签: c++gccmingwmextdm-gcc

解决方案


切换到TDM-GCC解决了使用 -O0 编译时 mex 文件无效的问题。显然没有其他事情(尽管我注意到其他差异)很重要。

我的错误(我认为)是我将 G++ 换成了 TDM-G++,但对于 GCC 也没有这样做,并且 repo 中有几个 C 文件。

至于用 编译MEX,这个问题在链接的问题中也得到了解决,所以它也是一个选项。

编辑:问题似乎在于 GCC 随着时间的推移而更新。在任何情况下,使用 -o0 它仍然会创建一个无效的 mex 文件。使用 -o1-2 很好,使用 -o3 会省略代码的重要部分,除非添加了虚拟打印语句。我发现最好的平衡是将其设置为使用 TDM-GCC/G++ 编译 DEBUG,并使用 GCC 的最新版本。


推荐阅读