在* .hxx中声明的虚函数,在* .cxx中定义,但在* .c中未定义

时间:2018-12-19 18:32:45

标签: c function gcc header undefined

我试图声明一个可以通过不同的* .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 :(得分:2)

<paper-dialog>是用于C ++文件的扩展名之一。您的编译器可能正在使用文件扩展名将源代码编译为C ++。编译C文件时,它将生成对C符号.cxx的未解析引用,但是编译后的C ++文件将grid_create定义为C ++符号。因此,链接器将保留对grid_create的C符号引用的解析,因为只有一个与grid_create相关联的C ++符号。

您可以尝试保护标头文件,以便C ++编译器将生成C符号而不是C ++符号。

void grid_create(void)