<function> ссылка с; символ (ы) не найден - PullRequest
4 голосов
/ 18 июня 2010

У меня есть фрагмент кода 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 ++ (который, как я уже сказал, включает в себя Предсказание.h), я вызываю эту функцию, затем компилирую (через Xcode), я получаю эту ошибку:

"runPrediction (int, location *, double *, int, location *)", на который ссылаются из:
mainFrame :: responseTo (char *, int) в mainFrame.o
ld: символ (ы) не найден
collect2: ld вернул 1 статус выхода

gnation.c помечен для компиляции для текущей цели.У меня нет проблем с другими файлами .cpp, которые не компилируются.Есть мысли здесь?

Ответы [ 3 ]

6 голосов
/ 18 июня 2010

Скорее всего, название функции искажено *. Вам необходимо сделать следующее:

extern "C" response runPrediction(int obs, location* positions,
                   double* observations, int targets, location* targetPositions);

Что говорит о том, что он должен обрабатываться как объявление функции C.

* C ++ изменяет имена функций, чтобы дать им уникальные имена на этапе компоновки, для перегрузки функций. В C нет функции перегрузки, поэтому такой вещи нет.


Точно так же, как вы знаете, вы также можете сделать блок extern "C", если у вас есть несколько вещей, чтобы extern:

extern "C"
{
    response runPrediction(int obs, location* positions,
                   double* observations, int targets, location* targetPositions);

    // other stuff
}

И, как Пол предлагает, чтобы разрешить использование заголовка в обоих случаях, используйте __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);
3 голосов
/ 18 июня 2010

Измените прогноз. Так, чтобы он выглядел так:

#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
0 голосов
/ 18 июня 2010

«Предсказание» действительно C, а не C ++?У вас будут разные компиляции по умолчанию, основанные на расширении файла, GMan покрывает это.

Если это будет C ++, и вы измените имя файла, я все равно рекомендую, чтобы runPrediction был отмечен как extern в заголовкеон не определен в локальном модуле C ++, определяющем класс mainFrame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...