3 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊
在Matlab 2011b中,只需在mingw64或cygwin環(huán)境中直接編譯和鏈接即可。
MINGWPATH=c:/MinGW64
CYGPATH=c:/cygwin
MATLABROOT=c:/Progra~1/MATLAB/R2011b
CC=$(MINGWPATH)/bin/x86_64-w64-mingw32-gcc
CFLAG= -Wall -m64 -O3 -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= -L$(MATLABROOT)/bin/win64 -L$(MATLABROOT)/extern/lib/win64/microsoft -lmex -lmx -lmwlapack -lmwblas -leng
EXE=../bin/engwindemo.exe
MEXTGT=
SRC=engwindemo.c
MEXSRC=
all:$(EXE)
$(EXE): $(SRC)
$(CC) $(CFLAG) -ladvapi32 -luser32 -lgdi32 -lkernel32 -lmingwex -o $(EXE)
@rm -f *.o*
$(MEXTGT): $(MEXSRC)
$(CC) $(MEXFLAG) -ladvapi32 -luser32 -lgdi32 -lkernel32 -lmingwex
@rm -f *.o*
將此makefile放在源代碼目錄和上make。無(wú)需dll文件轉(zhuǎn)換。

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
為什么不調(diào)整目錄中的mexopts.bat文件?這樣,您可以像在MATLAB中一樣,透明地使用“ mex”命令來(lái)編譯任何內(nèi)容,就像通過(guò)MATLAB使用來(lái)配置一樣mex -setup。我很驚訝以前沒(méi)有人這樣做。
以下文件適用于x64版本的Matlab和Mingw。我正在使用TDM Mingw64發(fā)行版,該發(fā)行版安裝在中p:\mingw64-tdm。我已經(jīng)安裝了p:\matlab\R2012aMatlab-進(jìn)行相應(yīng)編輯。
這是我正在使用的mexopts.bat文件,請(qǐng)將其復(fù)制粘貼到%USERPROFILE%\AppData\Roaming\MathWorks\MATLAB\R2012a\mexopts.bat:
@echo off
set MINGWPATH=p:\mingw64-tdm
set PATH=%MINGWPATH%\bin;%PATH%
set COMPILER=gcc
set COMPFLAGS=-c -m64 -I"%MATLAB%\extern\include" -DMATLAB_MEX_FILE -Wall -std=c99
set OPTIMFLAGS=-O3 -DNDEBUG
set DEBUGFLAGS=-g
set NAME_OBJECT=-o
set LINKER=gcc
set LINKFLAGS=-shared -L"%MATLAB%\bin\win64" -L"%MATLAB%\extern\lib\win64\microsoft" -lmex -lmx -leng -lmat -lmwlapack -lmwblas
set NAME_OUTPUT=-o "%OUTDIR%%MEX_NAME%%MEX_EXT%"
然后,您可以嘗試在Matlab中執(zhí)行以下操作:
mex -v p:\matlab\R2012a\extern\examples\mex\yprime.c
which yprime
應(yīng)該產(chǎn)生b:\code\m\yprime.mexw64(或任何當(dāng)前文件夾)。然后,如果您這樣做:
yprime(1,1:4)
您應(yīng)該看到:
ans =
2.0000 8.9685 4.0000 -1.0947
這意味著您在做生意。祝好運(yùn)!
編輯2014年10月:我現(xiàn)在使用比上面改進(jìn)的mexopts.bat文件,使用不同的MinGW64(比TDM的二進(jìn)制代碼生成速度稍快)。有關(guān)詳細(xì)信息和下載,請(qǐng)參見我的主頁(yè)。

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
從MATLAB R2015b開始,已正式支持MinGW!
現(xiàn)在,它在受支持的編譯器列表的頂部。
有關(guān)下載MinGW 的官方說(shuō)明,請(qǐng)參見此處(他們建議使用TDB-GCC)。
有列出了一些限制和警告(如不與其他編譯器編譯庫(kù)的鏈接,你必須抓住MEX文件中的例外,等等)。
下面是我制作XML文件以執(zhí)行相同操作的舊方法。
過(guò)去的歲月已經(jīng)過(guò)去,MATLAB(從R2014a開始)已轉(zhuǎn)移到用于配置MEX文件的基于XML的新系統(tǒng)。目前,MATLAB仍暫時(shí)支持舊版.bat文件,但它會(huì)困擾您。另一個(gè)變化是不同的C和C ++配置(稍后會(huì)有更多介紹)。
保持不變的是,您只需要下載并提取MinGW發(fā)行版并將MATLAB指向它。目前還沒(méi)有必要MSYS,Cygwin的或gnumex。唯一棘手的部分是將MATLAB指向它,但這是一個(gè)解決方案。
簡(jiǎn)潔版本
下載并提取MinGW發(fā)行版。選擇一個(gè),例如MinGW-w64(64位)或TDM-GCC(32位和64位選項(xiàng))。
使用該模板作為模板來(lái)定制XML配置文件(詳細(xì)信息請(qǐng)參見下面的長(zhǎng)版)。
設(shè)置MINGWROOT環(huán)境變量。
運(yùn)行mex -setup:[xmlfile] [C|C++]。
長(zhǎng)版
對(duì)于MinGW-w64,我執(zhí)行以下操作進(jìn)行設(shè)置:
從Sourceforge獲取w64的最新版本(或使用安裝程序選擇所需的工具鏈,根據(jù)需要選擇pthread或Win32線程版本)。
提取它,以便您有一個(gè)類似于的編譯器路徑C:\mingw-w64\x86_64-4.9.2-release-posix-seh-rt_v3-rev1\bin\x86_64-w64-mingw32-g++.exe。 如果您打算使用mex命令在MATLAB中進(jìn)行編譯,則不需要MSYS,cygwin或任何其他環(huán)境。檢查PATH環(huán)境變量,以確保g++路徑上沒(méi)有多個(gè)編譯器(),最好沒(méi)有。使用全新的命令提示符進(jìn)行驗(yàn)證。
使用自定義XML配置文件進(jìn)行設(shè)置。在我的GitHub存儲(chǔ)庫(kù)上,我以兩種文件類型發(fā)布了MinGW-w64的C ++配置:mex_C ++ _ mingw-w64.xml和舊版mingw_mexopts.bat。從此作為模板開始,并(可選)使用您下載和提取的MinGW發(fā)行版的描述性名稱和版本來(lái)編輯XML文件。
設(shè)置(或創(chuàng)建)MINGWROOT環(huán)境變量。這就是允許mex命令找到編譯器的原因。您可以在MATLAB中(并且每次 MATLAB以其中的startup.m腳本開頭userpath)都可以執(zhí)行此操作setenv,或者使用Windows屬性對(duì)話框或本機(jī)Windows 7 setx.exe命令僅執(zhí)行一次。
運(yùn)行mex -setup:C:\actual\configFilePath.xml C++。例如,使用.xml文件設(shè)置C ++ MEX文件編譯:
setenv('MINGWROOT','H:\mingw-w64\x86_64-4.9.2-release-posix-seh-rt_v3-rev1')
mex -setup:H:\building\GitHub\MATLAB\MinGW\mex_C++_mingw-w64.xml C++
輸出應(yīng)如下所示:
MEX配置為使用“ MinGW-w64 GCC 4.9.2 posixthreads seh”進(jìn)行C ++語(yǔ)言編譯。
如果需要,以類似的方式使用指定C語(yǔ)言的新XML配置文件設(shè)置C編譯器,即C編譯器前端(例如“ x86_64-w64-mingw32-gcc.exe”,該文件不會(huì)自動(dòng)鏈接C ++標(biāo)準(zhǔn)庫(kù)) ),根據(jù)需要調(diào)整鏈接庫(kù),編譯器標(biāo)志(例如,更改-std=c++11為-std=c99)等。
關(guān)于運(yùn)行時(shí)庫(kù)的靜態(tài)鏈接與動(dòng)態(tài)鏈接的說(shuō)明
像上面這樣用MinGW-w64創(chuàng)建的MEX文件之類的庫(kù),可能取決于一些DLL(在運(yùn)行時(shí)):LIBGCC_S_SEH-1.DLL(用于seh例外發(fā)行版)和LIBSTDC ++-6.DLL,可能還包括libwinpthread-1.dll。如果選擇的是pthreads發(fā)行版而不是Win32線程。如果您不想復(fù)制這些文件,則可以通過(guò)添加以下開關(guān)將運(yùn)行時(shí)庫(kù)靜態(tài)鏈接到MEX文件中:
-static-libgcc -static-libstdc++
XML模板中對(duì)此有一個(gè)注釋。有關(guān)libpthread-1.dll的信息,請(qǐng)參見此處。
對(duì)于TDM-GCC,情況恰恰相反:運(yùn)行時(shí)(包括pthread)是自動(dòng)靜態(tài)鏈接的。若要?jiǎng)討B(tài)鏈接,這將需要DLL,但會(huì)減小MEX文件的大小,您需要:
-shared-libgcc -shared-libstdc++
- 3 回答
- 0 關(guān)注
- 2081 瀏覽
添加回答
舉報(bào)