-3

我遵循了我在这里找到的指导。

我几乎完成了这项工作。以下部分是批量转换工作的段落。我创建了一个批处理文件来转换许多由 MSVC 在 Matlab 2011b Windows 7(64 位)中预先构建的 DLL。

    set path=C:\MinGW64\bin;C:\mingw\msys\bin;

    mkdir lib
    mkdir bin
    @echo y |copy *.dll  .\bin
    @echo y |copy *.lib  .\lib

    @echo EXPORTS >libmex.def
    @echo EXPORTS >libmx.def
    @echo EXPORTS >libmat.def
    @echo EXPORTS >libeng.def
    @echo EXPORTS >libmwlapack.def


    c:\mingw64\bin\pexports ./bin/libmex.dll | sed "s/^_//" > libmex.def
    c:\mingw64\bin\pexports ./bin/libmat.dll | sed "s/^_//" > libmat.def
    c:\mingw64\bin\pexports ./bin/libeng.dll | sed "s/^_//" > libeng.def
    c:\mingw64\bin\pexports ./bin/libmwlapack.dll | sed "s/^_//" >libmwlapack.def
    gendef ./bin/libmx.dll

    echo "Add the mexErrMsgTxt string to each def file,"
    echo "then press any key to continue the conversion process"
    pause

    lib /machine:x64 /def:libmex.def /name:.\bin\libmex.dll /out:.\lib\libmex.lib
    lib /machine:x64 /def:libmx.def  /name:.\bin\libmx.dll  /out:.\lib\libmx.lib
    lib /machine:x64 /def:libmat.def /name:.\bin\libmat.dll /out:.\lib\libmat.lib
    lib /machine:x64 /def:libeng.def /name:.\bin\libeng.dll /out:.\lib\libeng.lib
    lib /machine:x64 /def:libmwlapack.def /name:.\bin\libmwlapack.dll /out:.\lib\libmwlapack.lib

    c:\mingw64\bin\x86_64-w64-mingw32-dlltool --kill-at -U -d libmex.def -l /lib/libmex.a
    c:\mingw64\bin\x86_64-w64-mingw32-dlltool --kill-at -U -d libmat.def -l ./lib/libmat.a
    c:\mingw64\bin\x86_64-w64-mingw32-dlltool --kill-at -U -d libeng.def -l ./lib/libeng.a
    c:\mingw64\bin\x86_64-w64-mingw32-dlltool --kill-at -U -d libmx.def -l./lib/libmx.a
    c:\mingw64\bin\x86_64-w64-mingw32-dlltool --kill-at -U -d libmwlapack.def -l ./lib/libmwlapack.a

engwindemo.exe 的生成文件:

    LIBS= -Lc:/mingw64/lib ../lib/libeng.a ../lib/libmx.a ../lib/
    libmex.a ../lib/libmat.a

    CC=c:/mingw64/bin/gcc -m64 -O3 -I../include -Ic:/mingw64/include

    EXE=../bin/engwindemo.exe

    SRC=engwindemo.c

    all:$(EXE)

    $(EXE):  $(SRC)
           $(CC) $(SRC) $(LIBS) -L../lib -ladvapi32 -luser32 -lgdi32 -lkernel32 -
    lmingwex -o $(EXE)
           @rm -f *.o*

使用 (mingw64) gcc,编译和链接过程是可以的。执行 engwindemo.exe,我得到这个错误:

_engClose 入口点错误(在 libeng.dll 中)

在 mingw64 中,如何构建一个独立的应用程序 (engwindemo.exe),它从 libeng.dll (Matlab R2011b) 中的内置函数调用?

4

1 回答 1

-1

谢谢大家的回复!我已经搭建成功了!在Matlab R2011b win32/64下,只需在cygwin(x86_64-w64-mingw32-gcc 4.5.2)环境下设置,无需任何dll文件转换。主要设置部分如下

  1. 以短文件名形式设置 MATLABROOT(长文件名可能没问题。)

    MATLABROOT=c:/Progra~1/MATLAB/R2011b

  2. 链接 MSVC 构建的主库

    LIBS= -L$(MATLABROOT)/bin/win64 -lmex -lmx -lmwlapack -lmwblas -leng

  3. 用标志声明 gcc

    CC=x86_64-w64-mingw32-gcc

    CFLAG=-Wall -m64 -O3 -I$(MATLABROOT)/extern/include

    MEXFLAG=-m64 -shared -DMATLAB_MEX_FILE -I$(MATLABROOT)/extern/include -Wl,--export-all-symbols $(LIBS)

  4. 其他让编译器满意的附加参数。

    最后,在 cygwin consloe 或 mingw64 shell 中创建这个项目。

于 2012-02-26T04:32:44.677 回答