我有一段C代码,用于C ++函数。在我的C ++文件的顶部,我有一行:#include "prediction.h"
在prediction.h
我有这个:
#ifndef prediction
#define prediction
#include "structs.h"
typedef struct {
double estimation;
double variance;
} response;
response runPrediction(int obs, location* positions, double* observations,
int targets, location* targetPositions);
#endif
我也有prediction.c
,其中包含:
#include "prediction.h"
response runPrediction(int obs, location* positions, double* observations,
int targets, location* targetPositions) {
// code here
}
现在,在我的C ++文件中(我说的包括prediction.h)我调用该函数,然后编译(通过Xcode)我得到这个错误:
“runPrediction(int,location *,double *,int,location *)”,引自:
mainFrame中的mainFrame :: respondTo(char *,int)
ld:未找到符号
collect2:ld返回1退出状态
prediction.c被标记为当前目标的编译。我没有任何其他.cpp文件没有被编译的问题。有什么想法吗?
答案 0 :(得分:5)
可能该函数的名称为mangled *。您需要执行以下操作:
extern "C" response runPrediction(int obs, location* positions,
double* observations, int targets, location* targetPositions);
告诉它将其视为C函数声明。
* C ++破坏函数名称,以便在链接阶段为它们提供唯一的名称,以实现函数重载。 C没有函数重载,所以没有这样的东西。
您也知道,如果您有多个要外部的东西,您也可以制作extern "C"
块:
extern "C"
{
response runPrediction(int obs, location* positions,
double* observations, int targets, location* targetPositions);
// other stuff
}
与Paul建议一样,允许在两者中使用标头来使用__cplusplus
来调节它:
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endif
EXTERN_C response runPrediction(int obs, location* positions,
double* observations, int targets, location* targetPositions);
答案 1 :(得分:3)
更改prediction.h,使其看起来像这样:
#ifndef prediction
#define prediction
#include "structs.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
double estimation;
double variance;
} response;
response runPrediction(int obs, location* positions, double* observations,
int targets, location* targetPositions);
#ifdef __cplusplus
}
#endif
#endif
答案 2 :(得分:0)
'prediciton'是真的C而不是C ++吗?您将根据文件扩展名进行不同的默认编译,GMan将涵盖此内容。
如果它是C ++并且您更改了文件名,我仍然会认为runPrediction应该在标题中标记为extern,它不是在定义类mainFrame的本地C ++模块中定义的。