我通过使用Mex编译生成.mexa64二进制文件,将一些C ++功能编译到Matlab中。
老实说,我不太了解.mexa64二进制文件中创建的符号的内容以及它如何让Matlab调用C ++,但我从一个与错误相关的简单问题开始我最终当命令mex
调用ld
时获取。
ld
错误是:
/usr/bin/ld.real:重复的版本标签`MEX'
问题是,这个ld错误是什么"重复的版本标记"意思?其他值得赞赏的观点是:与我试图专门做的Matlab编译有什么关系;我在哪里可以找到全面的ld错误消息文档?
后一点,全面的ld
文档,我发现特别难找。 ld
的手册页似乎对此没有帮助。
要求发布mex配置文件:
<config Name="g++" ShortName="g++" Manufacturer="GNU" Version="" Language="C++" Priority="A" Location="$GCC_DIR">
<Details CompilerExecutable="$CXX" CompilerDefines="$DEFINES" CompilerFlags="$CXXFLAGS" OptimizationFlags="$CXXOPTIMFLAGS" DebugFlags="$CXXDEBUGFLAGS" IncludeFlags="$INCLUDE" LinkerLibraries="$LINKLIBS" LinkerOptimizationFlags="$LDOPTIMFLAGS" LinkerDebugFlags="$LDDEBUGFLAGS" CompilerDefineFormatter="-D%s" LinkerLibrarySwitchFormatter="-l%s" LinkerPathFormatter="-L%s"/>
<vars CMDLINE1="$CXX -c $DEFINES $INCLUDE $CXXFLAGS $OPTIM $SRC -o $OBJ" CMDLINE2="$LDXX $LDFLAGS $LDTYPE $LINKOPTIM $LINKEXPORT $OBJS $CXXLIBS $LINKLIBS -o $EXE" CMDLINE3="rm -f $OBJ" CXX="$GCC" DEFINES="-D_GNU_SOURCE $MATLABMEX" MATLABMEX="-DMATLAB_MEX_FILE " CXXFLAGS="-ansi -fexceptions -fPIC -fno-omit-frame-pointer -pthread -std=c++11" INCLUDE="-I"$MATLABROOT/extern/include" -I"$MATLABROOT/simulink/include"" CXXOPTIMFLAGS="-O -DNDEBUG" CXXDEBUGFLAGS="-g" LDXX="$CXX" LDFLAGS="-pthread -Wl,--no-undefined " LDTYPE="-shared" LINKEXPORT="-Wl,--version-script,"$MATLABROOT/extern/lib/$ARCH/mexFunction.map"" LINKLIBS="-Wl,-rpath-link,$MATLABROOT/bin/$ARCH -L"$MATLABROOT/bin/$ARCH" -lmx -lmex -lmat -lm -lstdc++" LDOPTIMFLAGS="-O" LDDEBUGFLAGS="-g" OBJEXT=".o" LDEXT=".mexa64"> </vars>
<client>
<engine LINKLIBS="$LINKLIBS -leng" LINKEXPORT="" LDEXT="" LDTYPE=""/>
<mbuild DEFINES="-D_GNU_SOURCE $MATLABMEX -DUNIX -DX11 -DGLNXA64 -DGCC" CXXFLAGS="-ansi -pthread -std=c++11" INCLUDE="$INCLUDE -I"$MATLABROOT/extern/include/cpp"" LDFLAGS="-pthread -Wl,-rpath-link,$MATLABROOT/bin/$ARCH" LINKEXPORT="" LINKLIBS="-L"$MATLABROOT/runtime/$ARCH" -lm -lmwmclmcrrt" LDEXT="" MATLABMEX="" LDTYPE=""/>
</client>
<locationFinder>
<GCC>
<cmdReturns name="which g++"/>
</GCC>
<CPPLIB_DIR>
<cmdReturns name="g++ -print-file-name=libstdc++.so" diagnostic="GCC appears to be installed, but supporting C++ libraries were not found. You must first install the gcc-c++ packge, or similiar, to complete this action."/>
</CPPLIB_DIR>
</locationFinder>
</config>