2014a上的Matlab C-gateway和Fortran-source混合mex函数

时间:2014-07-26 23:58:50

标签: c matlab fortran mex

直到版本2013a我编译,链接和运行我的C-gateway和Fortran-source混合mex函数(Windows,Linux和Mac)没有问题。编译和链接在R2014a-maci64上运行正常,但是当我尝试运行生成的mex函数时,我收到了以下消息:

Invalid MEX-file '/Users/name/MATLAB/mexaci64_R2014a/xxxx.mexmaci64':
dlopen(/Users/name/MATLAB/mexaci64_R2014a/xxxx.mexmaci64, 6): Symbol not found:
__gfortran_transfer_character_write
Referenced from: /Users/name/MATLAB/mexaci64_R2014a/xxxx.mexmaci64
Expected in: /Applications/MATLAB_R2014a.app/sys/os/maci64/libgfortran.3.dylib
in /Users/name/MATLAB/mexaci64_R2014a/xxxx.mexmaci64

我发现的第一件事是matlab附带的libgfortran.3.dylib似乎没有__gfortran_transfer_character_write(也有人检查过这个,好吗?),因为命令

nm libgfortran.3.dylib | grep __gfortran_transfer_character_write

什么都没有。

我用新库(比如gfortran 4.9.1或4.8.2)替换了整个maci64目录来获取

nm libgfortran.3.dylib | grep __gfortran_transfer_character_write
00000000000c7210 T __gfortran_transfer_character_write 

这意味着那里有东西(" T"符号在文本(代码)部分)。但是,如果我再次重新编译混合mex函数(当然使用新的gfortran编译器和正确的路径),错误消息仍然存在。

Fortran写命令(例如write(6,*))似乎是问题,因为所有其他没有fortran写入的混合mex函数都可以工作。

有人可以指出我做错了什么吗?

非常感谢

gfortran -c -I/Applications/MATLAB_2014a.app/extern/include -I/Applications/MATLAB_2014a.app/simulink/include -fexceptions -m64 -fbackslash  -DMX_COMPAT_32 -O sourcef1.f
gfortran -c -I/Applications/MATLAB_2014a.app/extern/include -I/Applications/MATLAB_2014a.app/simulink/include -fexceptions -m64 -fbackslash  -DMX_COMPAT_32 -O sourcef2.f

mex -v -O -compatibleArrayDims  sourcef1g.c sourcef1.o correl.o -L/Users/name/Downloads/tmp/usr/local/lib -lgfortran -L/Users/name/Downloads/tmp/usr/local/lib/gcc/x86_64-apple-darwin13.1.0/4.9.0 -lgfortranbegin
Verbose mode is on.
... Looking for compiler 'Xcode with Clang' ...
... Executing command 'xcode-select -print-path' ...Yes ('/Applications/Xcode.app/Contents/Developer').
... Looking for folder '/Applications/Xcode.app/Contents/Developer' ...Yes.
... Executing command 'which xcrun' ...Yes ('/usr/bin/xcrun').
... Looking for folder '/usr/bin' ...Yes.
... Executing command 'defaults read com.apple.dt.Xcode IDEXcodeVersionForAgreedToGMLicense' ...No.
... Executing command 'defaults read /Library/Preferences/com.apple.dt.Xcode IDEXcodeVersionForAgreedToGMLicense' ...Yes ('5.1').
... Executing command '
agreed=5.1 
 if echo $agreed | grep -E '[\.\"]' >/dev/null; then 
 lhs=`expr "$agreed" : '\([0-9]*\)[\.].*'` 
  rhs=`expr "$agreed" : '[0-9]*[\.]\(.*\)$'` 
 if echo $rhs | grep -E '[\."]' >/dev/null; then 
 rhs=`expr "$rhs" : '\([0-9]*\)[\.].*'` 
 fi 
 if [ $lhs -gt 4 ] || ( [ $lhs -eq 4 ] && [ $rhs -ge 3 ] ); then 
 echo $agreed 
 else 
 exit 1
 fi 
 fi' ...Yes ('5.1').
... Executing command 'xcode-select -print-path' ...Yes ('/Applications/Xcode.app/Contents/Developer').
... Looking for folder '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk' ...No.
... Looking for folder '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk' ...Yes.
... Executing command 'xcode-select -print-path' ...Yes ('/Applications/Xcode.app/Contents/Developer').
... Looking for folder '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk' ...No.
... Looking for folder '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk' ...Yes.
... Executing command 'echo /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk | rev | cut -c1-10 | rev | egrep -oh '[0-9]+\.[0-9]+'' ...Yes ('10.8').
Found installed compiler 'Xcode with Clang'.
Options file details
-------------------------------------------------------------------
    Compiler location: /Applications/Xcode.app/Contents/Developer
    Options file: /Users/name/.matlab/R2014a/mex_C_maci64.xml
    CMDLINE100 : /usr/bin/xcrun -sdk macosx10.8 clang -c -DMX_COMPAT_32   -DMATLAB_MEX_FILE -I"/Applications/MATLAB_R2014a.app/extern/include" -I"/Applications/MATLAB_R2014a.app/simulink/include" -fno-common -arch x86_64 -mmacosx-version-min=10.8 -fexceptions -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -O2 -DNDEBUG /Users/name/MATLAB/mexaci64_R2014a/sourcef1g.c -o /var/folders/2x/9tfgl3sn1gq0kl_l9yl5q00c0000gn/T//mex_17182455108154_3778/sourcef1g.o
    CMDLINE200 : /usr/bin/xcrun -sdk macosx10.8 clang -Wl,-twolevel_namespace -undefined error -arch x86_64 -mmacosx-version-min=10.8 -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -bundle  -Wl,-exported_symbols_list,"/Applications/MATLAB_R2014a.app/extern/lib/maci64/mexFunction.map" /var/folders/2x/9tfgl3sn1gq0kl_l9yl5q00c0000gn/T//mex_17182455108154_3778/sourcef1g.o sourcef1.o correl.o -O -Wl,-exported_symbols_list,"/Applications/MATLAB_R2014a.app/extern/lib/maci64/mexFunction.map"  -lgfortran  -lgfortranbegin   -L/Users/name/Downloads/tmp/usr/local/lib  -L/Users/name/Downloads/tmp/usr/local/lib/gcc/x86_64-apple-darwin13.1.0/4.9.0   -L"/Applications/MATLAB_R2014a.app/bin/maci64" -lmx -lmex -lmat -lstdc++ -o sourcef1g.mexmaci64
    CMDLINE300 : rm -f /var/folders/2x/9tfgl3sn1gq0kl_l9yl5q00c0000gn/T//mex_17182455108154_3778/sourcef1g.o
    CC : /usr/bin/xcrun -sdk macosx10.8 clang
    DEFINES : -DMX_COMPAT_32   -DMATLAB_MEX_FILE
    MATLABMEX : -DMATLAB_MEX_FILE
    CFLAGS : -fno-common -arch x86_64 -mmacosx-version-min=10.8 -fexceptions -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk
    INCLUDE : -I"/Applications/MATLAB_R2014a.app/extern/include" -I"/Applications/MATLAB_R2014a.app/simulink/include"
    COPTIMFLAGS : -O2 -DNDEBUG
    CDEBUGFLAGS : -g
    LD : /usr/bin/xcrun -sdk macosx10.8 clang
    LDFLAGS : -Wl,-twolevel_namespace -undefined error -arch x86_64 -mmacosx-version-min=10.8 -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -bundle  -Wl,-exported_symbols_list,"/Applications/MATLAB_R2014a.app/extern/lib/maci64/mexFunction.map"
    LDBUNDLE : -bundle 
    LINKEXPORT : -Wl,-exported_symbols_list,"/Applications/MATLAB_R2014a.app/extern/lib/maci64/mexFunction.map"
    LINKLIBS : -lgfortran  -lgfortranbegin   -L/Users/name/Downloads/tmp/usr/local/lib  -L/Users/name/Downloads/tmp/usr/local/lib/gcc/x86_64-apple-darwin13.1.0/4.9.0   -L"/Applications/MATLAB_R2014a.app/bin/maci64" -lmx -lmex -lmat -lstdc++
    LDOPTIMFLAGS : -O
    LDDEBUGFLAGS : -g
    OBJEXT : .o
    LDEXT : .mexmaci64
    XCODE_DIR : /Applications/Xcode.app/Contents/Developer
    XCRUN_DIR : /usr/bin
    XCODE_AGREED_VERSION : 5.1
    ISYSROOT : /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk
    SDKVER : 10.8
    MATLABROOT : /Applications/MATLAB_R2014a.app
    ARCH : maci64
    SRC : /Users/name/MATLAB/mexaci64_R2014a/sourcef1g.c
    OBJ : /var/folders/2x/9tfgl3sn1gq0kl_l9yl5q00c0000gn/T//mex_17182455108154_3778/sourcef1g.o
    OBJS : /var/folders/2x/9tfgl3sn1gq0kl_l9yl5q00c0000gn/T//mex_17182455108154_3778/sourcef1g.o sourcef1.o correl.o
    SRCROOT : /Users/name/MATLAB/mexaci64_R2014a/sourcef1g
    DEF : /var/folders/2x/9tfgl3sn1gq0kl_l9yl5q00c0000gn/T//mex_17182455108154_3778/sourcef1g.def
    EXP : sourcef1g.exp
    LIB : sourcef1g.lib
    EXE : sourcef1g.mexmaci64
    ILK : sourcef1g.ilk
    MANIFEST : sourcef1g.mexmaci64.manifest
    TEMPNAME : sourcef1g
    EXEDIR : 
    EXENAME : sourcef1g
    OPTIM : -O2 -DNDEBUG
    LINKOPTIM : -O
-------------------------------------------------------------------
Building with 'Xcode with Clang'.
/usr/bin/xcrun -sdk macosx10.8 clang -c -DMX_COMPAT_32   -DMATLAB_MEX_FILE -I"/Applications/MATLAB_R2014a.app/extern/include" -I"/Applications/MATLAB_R2014a.app/simulink/include" -fno-common -arch x86_64 -mmacosx-version-min=10.8 -fexceptions -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -O2 -DNDEBUG /Users/name/MATLAB/mexaci64_R2014a/sourcef1g.c -o /var/folders/2x/9tfgl3sn1gq0kl_l9yl5q00c0000gn/T//mex_17182455108154_3778/sourcef1g.o


/usr/bin/xcrun -sdk macosx10.8 clang -Wl,-twolevel_namespace -undefined error -arch x86_64 -mmacosx-version-min=10.8 -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -bundle  -Wl,-exported_symbols_list,"/Applications/MATLAB_R2014a.app/extern/lib/maci64/mexFunction.map" /var/folders/2x/9tfgl3sn1gq0kl_l9yl5q00c0000gn/T//mex_17182455108154_3778/sourcef1g.o sourcef1.o correl.o -O -Wl,-exported_symbols_list,"/Applications/MATLAB_R2014a.app/extern/lib/maci64/mexFunction.map"  -lgfortran  -lgfortranbegin   -L/Users/name/Downloads/tmp/usr/local/lib  -L/Users/name/Downloads/tmp/usr/local/lib/gcc/x86_64-apple-darwin13.1.0/4.9.0   -L"/Applications/MATLAB_R2014a.app/bin/maci64" -lmx -lmex -lmat -lstdc++ -o sourcef1g.mexmaci64
rm -f /var/folders/2x/9tfgl3sn1gq0kl_l9yl5q00c0000gn/T//mex_17182455108154_3778/sourcef1g.o
MEX completed successfully.

mv -f sourcef1g.mexmaci64 sourcef1.mexmaci64

1 个答案:

答案 0 :(得分:1)

实际上,根据此页面,MATLAB(或MEX)不支持版本高于4.3.x的gfortran:Supported and Compatible Compilers – Release 2014a

之前我遇到过完全相同的问题。在我切换到gfortran-mp-4.3后,问题解决了。