Пустая функция объявлена ​​в * .hxx, определена в * .cxx, но не определена в * .c - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь объявить глобальную функцию, доступную через разные * .c файлы.

Я объявил ее в param.hxx, определил ее в param.cxx и хотел бы получить к ней доступ в compute_grid.c.

К сожалению, во время компиляции у меня возникает следующая ошибка:

compute_grid.c:(.text+0x5) : undefined reference to « grid_create »

Я не очень знаком с такими объявлениями функций в C. На самом деле я создаю часть модулябольшой программы, я скопировал это объявление из другого файла кода, который, кажется, работает?!

К сожалению, программа очень конфиденциальна, у меня нет доступа ко всем источникам, но я будусделать все возможное, чтобы дать вам вычеркнутые детали ...

param.hxx:

typedef struct grid_t
{
    int   *test;
} grid_t;

void 
grid_create(void);

extern grid_t *grid;

param.cxx:

#include <malloc.h>
#include "param.hxx"

grid_t *grid;

void grid_create(void)
{
    grid = (grid_t*)malloc(sizeof(grid_t));
    grid->test = (int*)malloc(sizeof(int));
    *grid->test = 123;
}

compute_grid.c:

#include "param.hxx"

void
compute_grid()
{
    grid_create();

    return;
}

Спасибо за помощь!

1 Ответ

0 голосов
/ 19 декабря 2018

.cxx является одним из расширений, используемых для файлов C ++.Ваш компилятор может использовать расширение файла для компиляции исходного кода как C ++.Когда файл C компилируется, он генерирует неразрешенную ссылку на символ C grid_create, но скомпилированный файл C ++ определяет grid_create как символ C ++.Таким образом, компоновщик оставит ссылку на символ C на grid_create неразрешенной, поскольку существует только символ C ++, связанный с void grid_create(void).

. Вы можете попытаться защитить файл заголовка, чтобы компилятор C ++ генерировалсимвол C, а не C ++.

#ifdef __cplusplus
extern "C" {
#endif

void 
grid_create(void);


#ifdef __cplusplus
}
#endif
...