在使用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
的编译链接?
由于 基督教
答案 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