簡體   English   中英

更新的軟件包,現在用 -O0 編譯的 Mex 文件是“無效的 mex 文件”?

[英]Updated packages, now Mex files compiled with -O0 are "invalid mex file"?

我有一組(以前工作和編譯了幾個月)MEX 文件集。 我用 pacman -Syu 更新了我 3 個月大的軟件包(以前在 GCC/G++ 中運行良好),現在這是我的結果:

對於GCC/G++

  • O0 - MEX 文件“無效”
  • O1-O2 - 作品
  • O3 - “優化”了整個程序。 一個簡單的 mexPrintf() 在正確的位置通過強制它不優化它來解決這個問題

對於鏗鏘

  • 沒有任何效果,所有優化級別都會導致無效的 mexfile

對於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命令嘗試的內容和我們所做的有以下差異:

目標文件的差異:

  • 我們正在使用 mingw G++ 編譯器,他們使用 TDM (交換沒有修復它)
  • 它們包括 simulink/include,我們沒有。 (添加沒有修復它)
  • 他們使用-O。 這是否意味着-O1? -O2? -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 的最新版本進行其他所有操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM