更新包,现在用 -O0 编译的 Mex 文件是 "invalid mex file"?
Updated packages, now Mex files compiled with -O0 are "invalid mex file"?
我有一组(之前工作和编译了几个月)MEX 文件。我用 pacman -Syu 更新了我 3 个月大的软件包(之前在 GCC/G++ 上运行良好),现在这是我的结果:
对于GCC/G++:
- O0 - MEX 文件是 "invalid"
- O1-O2 - 有效
- O3 - "optimizes"走完了整个节目。一个简单的 mexPrintf() 在正确的位置通过强制它不优化它来解决这个问题
对于Clang:
- 没有任何效果,所有优化级别都会导致无效的 mexfile
对于TDM-GCC:
- 无论优化级别如何,都能完美运行
OS: Win 10,最新更新
语言:C++03
MATLAB 版本:R2016B(没有 Update 7,虽然经过测试,但没有帮助)
(不能更改 C++ 或 MATLAB 版本,这是客户要求)
MINGW64 GCC 版本:9.2.0
TDM GCC 版本:5.1.0-2
目前无法使用 mex
进行编译。 (关于它我做了一个新的post)
下面是生成 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? -氧气? -O3?不清楚。
mex 文件的差异:
- 我们正在使用 mingw G++ 编译器,他们使用 TDM
(交换没有解决)
- 他们有 -s,我们没有(尝试添加它,但没有解决任何问题)
- 他们有 -llibmx -llibmex -llibmat -lm -llibmwlapack -llibmwblas,我们没有。 (尝试添加它们,但没有解决任何问题)
- 他们没有 -lmex -lmx(删除并没有解决)
- 我们有 -Wl,-Bsymbolic 他们没有(删除它没有解决任何问题)
晦涩的编译器问题不是我的专长。有人对这里的问题有什么建议吗?
切换到 TDM-GCC 解决了使用 -O0 编译时 mex 文件无效的问题。没有别的(尽管我注意到其他差异)显然很重要。
我的错误(我认为)是我将 G++ 换成 TDM-G++,但没有换成 GCC,并且在 repo 中有几个 C 文件。
至于使用 MEX
编译,该问题在链接问题中也已解决,因此也是一个选项。
编辑:问题似乎在于 GCC 随着时间的推移而更新。在任何情况下,使用 -o0 它仍然会创建一个无效的 mex 文件。使用 -o1-2 没问题,使用 -o3 它会忽略代码的重要部分,除非添加虚拟打印语句。我发现最好的平衡是将其设置为使用 TDM-GCC/G++ 编译 DEBUG,并使用 GCC 的最新版本进行所有其他操作。
我有一组(之前工作和编译了几个月)MEX 文件。我用 pacman -Syu 更新了我 3 个月大的软件包(之前在 GCC/G++ 上运行良好),现在这是我的结果:
对于GCC/G++:
- O0 - MEX 文件是 "invalid"
- O1-O2 - 有效
- O3 - "optimizes"走完了整个节目。一个简单的 mexPrintf() 在正确的位置通过强制它不优化它来解决这个问题
对于Clang:
- 没有任何效果,所有优化级别都会导致无效的 mexfile
对于TDM-GCC:
- 无论优化级别如何,都能完美运行
OS: Win 10,最新更新
语言:C++03
MATLAB 版本:R2016B(没有 Update 7,虽然经过测试,但没有帮助)
(不能更改 C++ 或 MATLAB 版本,这是客户要求)
MINGW64 GCC 版本:9.2.0
TDM GCC 版本:5.1.0-2
目前无法使用 mex
进行编译。 (关于它我做了一个新的post
下面是生成 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? -氧气? -O3?不清楚。
mex 文件的差异:
- 我们正在使用 mingw G++ 编译器,他们使用 TDM
(交换没有解决) - 他们有 -s,我们没有(尝试添加它,但没有解决任何问题)
- 他们有 -llibmx -llibmex -llibmat -lm -llibmwlapack -llibmwblas,我们没有。 (尝试添加它们,但没有解决任何问题)
- 他们没有 -lmex -lmx(删除并没有解决)
- 我们有 -Wl,-Bsymbolic 他们没有(删除它没有解决任何问题)
晦涩的编译器问题不是我的专长。有人对这里的问题有什么建议吗?
切换到 TDM-GCC 解决了使用 -O0 编译时 mex 文件无效的问题。没有别的(尽管我注意到其他差异)显然很重要。
我的错误(我认为)是我将 G++ 换成 TDM-G++,但没有换成 GCC,并且在 repo 中有几个 C 文件。
至于使用 MEX
编译,该问题在链接问题中也已解决,因此也是一个选项。
编辑:问题似乎在于 GCC 随着时间的推移而更新。在任何情况下,使用 -o0 它仍然会创建一个无效的 mex 文件。使用 -o1-2 没问题,使用 -o3 它会忽略代码的重要部分,除非添加虚拟打印语句。我发现最好的平衡是将其设置为使用 TDM-GCC/G++ 编译 DEBUG,并使用 GCC 的最新版本进行所有其他操作。