更新的包,现在用 -O0 编译的 Mex 文件是“无效的 mex 文件”?

Posted

技术标签:

【中文标题】更新的包,现在用 -O0 编译的 Mex 文件是“无效的 mex 文件”?【英文标题】:Updated packages, now Mex files compiled with -O0 are "invalid mex file"? 【发布时间】:2019-08-20 15:51:18 【问题描述】:

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

对于 GCC/G++

O0 - MEX 文件“无效” O1-O2 - 工作 O3 - “优化”了整个程序。一个简单的 mexPrintf() 在正确的位置通过强制它不优化它来解决这个问题

对于Clang

没有任何效果,所有优化级别都会导致 mexfile 无效

对于 TDM-GCC

无论优化级别如何,都能完美运行

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

语言:C++03

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

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

MINGW64 GCC 版本:9.2.0

TDM GCC 版本:5.1.0-2

目前无法使用mex 进行编译。 (我发了一篇关于它的新帖子here)

创建 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 命令的尝试和我们所做的有以下不同:

目标文件的区别:

我们正在使用 mingw G++ 编译器,他们使用 TDM (交换没有修复它) 它们包括 simulink/include,我们不包括。 (添加并没有解决它) 他们使用-O。这是否意味着-O1? -O2? -O3?不清楚。

mex 文件的不同之处:

我们正在使用 mingw G++ 编译器,他们使用 TDM (交换没有修复它) 他们有 -s,我们没有(尝试添加它,但没有解决任何问题) 他们有 -llibmx -llibmex -llibmat -lm -llibmwlapack -llibmwblas,我们没有。 (尝试添加它们,没有解决任何问题) 他们没有 -lmex -lmx(删除并没有修复它) 我们有 -Wl,-Bsymbolic 他们没有(删除它并没有解决任何问题)

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

【问题讨论】:

除了调试,你为什么要使用-O0 构建? 它是用于调试的,我们需要能够使用该标志正确调试。我们不能让它不起作用。 【参考方案1】:

切换到TDM-GCC 修复了使用 -O0 编译时 mex 文件无效的问题。其他一切(尽管我注意到了其他差异)显然并不重要。

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

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

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

【讨论】:

以上是关于更新的包,现在用 -O0 编译的 Mex 文件是“无效的 mex 文件”?的主要内容,如果未能解决你的问题,请参考以下文章

尽管并行编译,Mex 文件仍串行执行

matlab 解决 错误使用 mex 未找到支持的编译器或 SDK

如何通过 Eclipse 编码和编译 Matlab mex 文件?

怎么用c语言实现matlab中的功能?

有没有办法将 mex 文件链接到没有 -fPIC 编译的代码

编译 mex 文件时出现链接错误