Matlab 2013b生成的代码在mex中为架构x86_64错误生成未定义的符号

我有一个由Simulink编码器生成的C代码,我需要在C S函数中使用它。

这可能听起来有点奇怪,但我需要在编写s函数的输出之前在s函数中多次执行此代码(这是一种演化算法,需要在评估和排名之前模拟许多人的预测……但这些细节并不重要)。

问题是,当我尝试使用我的代码时,我似乎遇到了64位指令集的问题。

我将生成的erg_main.c作为如何与生成的代码进行交互的示例:

/* * File: ert_main.c * * Code generated for Simulink model 'Peltier_model'. * * Model version : 1.14 * Simulink Coder version : 8.5 (R2013b) 08-Aug-2013 * C/C++ source code generated on : Thu Apr 3 18:01:46 2014 * * Target selection: ert.tlc * Embedded hardware selection: 32-bit Generic * Emulation hardware selection: * Differs from embedded hardware (MATLAB Host) * Code generation objective: Debugging * Validation result: Passed (0), Warning (1), Error (0) */ #include  /* This ert_main.c example uses printf/fflush */ #include "Peltier_model.h" /* Model's header file */ #include "rtwtypes.h" /* * Associating rt_OneStep with a real-time clock or interrupt service routine * is what makes the generated code "real-time". The function rt_OneStep is * always associated with the base rate of the model. Subrates are managed * by the base rate from inside the generated code. Enabling/disabling * interrupts and floating point context switches are target specific. This * example code indicates where these should take place relative to executing * the generated code step function. Overrun behavior should be tailored to * your application needs. This example simply sets an error status in the * real-time model and returns from rt_OneStep. */ void rt_OneStep(void) { static boolean_T OverrunFlag = 0; /* Disable interrupts here */ /* Check for overrun */ if (OverrunFlag) { rtmSetErrorStatus(Peltier_model_M, "Overrun"); return; } OverrunFlag = TRUE; /* Save FPU context here (if necessary) */ /* Re-enable timer or interrupt here */ /* Set model inputs here */ /* Step the model */ Peltier_model_step(); /* Get model outputs here */ /* Indicate task complete */ OverrunFlag = FALSE; /* Disable interrupts here */ /* Restore FPU context here (if necessary) */ /* Enable interrupts here */ } /* * The example "main" function illustrates what is required by your * application code to initialize, execute, and terminate the generated code. * Attaching rt_OneStep to a real-time clock is target specific. This example * illustates how you do this relative to initializing the model. */ int_T main(int_T argc, const char *argv[]) { /* Unused arguments */ (void)(argc); (void)(argv); /* Initialize model */ Peltier_model_initialize(); /* Attach rt_OneStep to a timer or interrupt service routine with * period 0.01 seconds (the model's base sample time) here. The * call syntax for rt_OneStep is * * rt_OneStep(); */ printf("Warning: The simulation will run forever. " "Generated ERT main won't simulate model step behavior. " "To change this behavior select the 'MAT-file logging' option.\n"); fflush((NULL)); while (rtmGetErrorStatus(Peltier_model_M) == (NULL)) { /* Perform other application tasks here */ } /* Disable rt_OneStep() here */ /* Terminate model */ Peltier_model_terminate(); return 0; } /* * File trailer for generated code. * * [EOF] */ 

现在我只是尝试使用Peltier_model_initialize();初始化我的模型Peltier_model_initialize(); 并包括the erg_main.c那些头文件

尝试mex这导致以下结果:

 ************************************************************************** Warning: Neither -compatibleArrayDims nor -largeArrayDims is selected. Using -compatibleArrayDims. In the future, MATLAB will require the use of -largeArrayDims and remove the -compatibleArrayDims option. For more information, see: http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html ************************************************************************** -> mexopts.sh sourced from directory (DIR = $PREF_DIR) FILE = /Users/JoachimSA/.matlab/R2013b/mexopts.sh ---------------------------------------------------------------- -> MATLAB = /Applications/MATLAB_R2013b.app -> CC = xcrun -sdk macosx10.9 clang -> CC flags: CFLAGS = -fno-common -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -mmacosx-version-min=10.9 -fexceptions CDEBUGFLAGS = -g COPTIMFLAGS = -O2 -DNDEBUG CLIBS = -L/Applications/MATLAB_R2013b.app/bin/maci64 -lmx -lmex -lmat -lstdc++ arguments = -DMX_COMPAT_32 -> CXX = xcrun -sdk macosx10.9 clang++ -> CXX flags: CXXFLAGS = -fno-common -fexceptions -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -mmacosx-version-min=10.9 CXXDEBUGFLAGS = -g CXXOPTIMFLAGS = -O2 -DNDEBUG CXXLIBS = -L/Applications/MATLAB_R2013b.app/bin/maci64 -lmx -lmex -lmat -lstdc++ arguments = -DMX_COMPAT_32 -> FC = gfortran -> FC flags: FFLAGS = -fexceptions -m64 -fbackslash FDEBUGFLAGS = -g FOPTIMFLAGS = -O FLIBS = -L/Applications/MATLAB_R2013b.app/bin/maci64 -lmx -lmex -lmat -L -lgfortran -L -lgfortranbegin arguments = -DMX_COMPAT_32 -> LD = xcrun -sdk macosx10.9 clang -> Link flags: LDFLAGS = -arch x86_64 -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -mmacosx-version-min=10.9 -bundle -Wl,-exported_symbols_list,/Applications/MATLAB_R2013b.app/extern/lib/maci64/mexFunction.map LDDEBUGFLAGS = -g LDOPTIMFLAGS = -O LDEXTENSION = .mexmaci64 arguments = -> LDCXX = -> Link flags: LDCXXFLAGS = LDCXXDEBUGFLAGS = LDCXXOPTIMFLAGS = LDCXXEXTENSION = arguments = ---------------------------------------------------------------- -> xcrun -sdk macosx10.9 clang -c -I/Applications/MATLAB_R2013b.app/rtw/c/src -I/Users/JoachimSA/Documents/WICHTIG/Diplomarbeit/Matlab_FIles/Peltier_Codegen/Peltier_model_ert_rtw -I/Applications/MATLAB_R2013b.app/extern/include -I/Applications/MATLAB_R2013b.app/simulink/include -DMATLAB_MEX_FILE -fno-common -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -mmacosx-version-min=10.9 -fexceptions -DMX_COMPAT_32 -O2 -DNDEBUG "CC_IMEA.c" -> xcrun -sdk macosx10.9 clang -c -I/Applications/MATLAB_R2013b.app/rtw/c/src -I/Users/JoachimSA/Documents/WICHTIG/Diplomarbeit/Matlab_FIles/Peltier_Codegen/Peltier_model_ert_rtw -I/Applications/MATLAB_R2013b.app/extern/include -I/Applications/MATLAB_R2013b.app/simulink/include -DMATLAB_MEX_FILE -fno-common -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -mmacosx-version-min=10.9 -fexceptions -DMX_COMPAT_32 -O2 -DNDEBUG "CC_Opt_Objectives.c" -> xcrun -sdk macosx10.9 clang -c -I/Applications/MATLAB_R2013b.app/rtw/c/src -I/Users/JoachimSA/Documents/WICHTIG/Diplomarbeit/Matlab_FIles/Peltier_Codegen/Peltier_model_ert_rtw -I/Applications/MATLAB_R2013b.app/extern/include -I/Applications/MATLAB_R2013b.app/simulink/include -DMATLAB_MEX_FILE -fno-common -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -mmacosx-version-min=10.9 -fexceptions -DMX_COMPAT_32 -O2 -DNDEBUG "CC_System_Utils.c" -> xcrun -sdk macosx10.9 clang -c -I/Applications/MATLAB_R2013b.app/rtw/c/src -I/Users/JoachimSA/Documents/WICHTIG/Diplomarbeit/Matlab_FIles/Peltier_Codegen/Peltier_model_ert_rtw -I/Applications/MATLAB_R2013b.app/extern/include -I/Applications/MATLAB_R2013b.app/simulink/include -DMATLAB_MEX_FILE -fno-common -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -mmacosx-version-min=10.9 -fexceptions -DMX_COMPAT_32 -O2 -DNDEBUG "CC_Opt_SystemCabin.c" -> xcrun -sdk macosx10.9 clang -c -I/Applications/MATLAB_R2013b.app/rtw/c/src -I/Users/JoachimSA/Documents/WICHTIG/Diplomarbeit/Matlab_FIles/Peltier_Codegen/Peltier_model_ert_rtw -I/Applications/MATLAB_R2013b.app/extern/include -I/Applications/MATLAB_R2013b.app/simulink/include -DMATLAB_MEX_FILE -fno-common -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -mmacosx-version-min=10.9 -fexceptions -DMX_COMPAT_32 -O2 -DNDEBUG "CC_Optimiser.c" -> xcrun -sdk macosx10.9 clang -O -arch x86_64 -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -mmacosx-version-min=10.9 -bundle -Wl,-exported_symbols_list,/Applications/MATLAB_R2013b.app/extern/lib/maci64/mexFunction.map -o "CC_Optimiser.mexmaci64" CC_IMEA.o CC_Opt_Objectives.o CC_System_Utils.o CC_Opt_SystemCabin.o CC_Optimiser.o -L/Applications/MATLAB_R2013b.app/bin/maci64 -lmx -lmex -lmat -lstdc++ Undefined symbols for architecture x86_64: "_Peltier_model_initialize", referenced from: _CC_Opt_SystemCabin in CC_Opt_SystemCabin.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) mex: link of ' "CC_Optimiser.mexmaci64"' failed. Unable to complete successfully. Error in build_mex_files (line 6) mex -v ... Error in run (line 63) evalin('caller', [script ';']); 

我的6bit版本是否真的有问题,或者我只是不正确处理代码?

非常感谢您的帮助 !

OP发现需要在mex命令中指定所有源文件。

如果主源文件包含所有必需的声明,这可能导致编译成功,但链接失败。

以下是 MathWorks网站上“构建MEX文件”的“链接多个文件”部分的一些附加信息

您可以组合多个源文件,目标文件和文件库来构建二进制MEX文件。 为此,请列出附加文件及其文件扩展名,以空格分隔。 MEX文件的名称是列表中第一个文件的名称。

以下命令将多个不同类型的文件组合成一个名为circle.ext的二进制MEX文件,其中ext是与当前平台对应的扩展名:

mex circle.c square.obj rectangle.c shapes.lib

如上所述,将带有mexFunction的文件作为列表中的第一个,以便MEX文件从该文件中获取名称。

mex帮助页面有一个“使用多个源文件构建MEX文件”一节,但有一个类似的例子,尽管有Fortran源代码:

mex -largeArrayDims fulltosparse.F loadsparse.F

MEX文件名是fulltosparse,因为fulltosparse.F是命令行上的第一个文件。