<function>引自;未找到符号</function>

时间:2010-06-17 21:07:46

标签: c++ c xcode compiler-construction

我有一段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文件没有被编译的问题。有什么想法吗?

3 个答案:

答案 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 ++模块中定义的。