为什么matlab没有链接我的C MEX代码?

时间:2011-10-24 17:32:03

标签: visual-c++ matlab compilation mex

在使用MS VC ++编译器编译我的mex C函数时遇到以下问题:我在一个单独的文件disc_rhs__中有一个函数disc_rhs.c,它是由f2c创建的(这应该是不重要的,但是。 ..)。在我的主要功能中,我在某处写了

...
disc_rhs__(...);
...

我尝试使用

进行编译
mex sfun_kalman.cpp -L. -llapack -lcblas_WIN -lblas_WIN -lf2c disc_rhs.c kalmanfilter_f2c.cpp

这会导致错误。链接器找不到""int __cdecl disc_rhs__(double *,double *,double *,double *,double *)" (?disc_rhs__@@YAHPAN0000@Z)"中使用的外部符号kalmanfilter.cpp

为了完成所有编译,我将disc_rhs.cpp复制到disc_rhs.h并删除了函数声明,只是让存根。我将其包含在kalmanfilter.h

那么为什么matlab mex编译器无法识别corrct符号并与disc_rhs.c的编译链接?

由于 基督教

1 个答案:

答案 0 :(得分:1)

不要将disc_rhs.cpp的全部内容放入头文件中,然后将其包含在另一个文件中。这只会在单个源文件包含该文件的时间内工作,只要将其包含在另一个源文件中,就会出现多个定义错误。

解决此问题的正确方法是创建一个disc_rhs.h文件,其中包含需要由其他模块使用的disc_rhs.cpp中所有函数的原型。然后,您将头文件包含在kalmanfilter.cpp(以及需要使用这些函数的任何其他文件)中。

修改
发生错误的原因是disc_rhs文件具有 .c 扩展名,导致MSVC将其编译为C文件。但是,由于它在kalmanfilter.cpp中使用,链接器期望找到一个名称已损坏的C ++函数,该函数不存在。要解决此问题,您需要告诉编译器disc_rhs__()是一个C函数。

在disc_rhs.h

#ifdef __cplusplus
extern "C" 
#endif
int disc_rhs__(double *,double *,double *,double *,double *);

extern "C"指令需要出现在disc_rhs.c导出的每个项目的前面,所以如果你有几件要外部的东西,下面的语法会更方便。

#ifdef __cplusplus
extern "C" {
#endif
int disc_rhs__(double *,double *,double *,double *,double *);

// other stuff being externed

#ifdef __cplusplus
}
#endif