【问题标题】:Void function declared in *.hxx, defined in *.cxx but undefined in *.c在 *.hxx 中声明的无效函数,在 *.cxx 中定义但在 *.c 中未定义
【发布时间】:2018-12-19 18:32:44
【问题描述】:

我正在尝试声明一个可通过不同 *.c 文件访问的全局函数。

我已在 param.hxx 中声明,在 param.cxx 中定义,我想在 compute_grid.c 中访问它。

不幸的是,在编译过程中出现以下错误:

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

我对 C 中的此类函数声明不是很熟悉。实际上我正在构建一个大程序的模块部分,我已经从另一个代码文件中复制了这些声明,这似乎可以工作?!

不幸的是,该程序非常机密,我无法访问所有来源,但我会尽力为您提供已删除的部分...

参数.hxx:

typedef struct grid_t
{
    int   *test;
} grid_t;

void 
grid_create(void);

extern grid_t *grid;

参数.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;
}

感谢您的帮助!

【问题讨论】:

  • 你用什么命令编译?
  • 您需要编译这两个源并将它们链接在一起。也许这可以通过在编译器命令行上同时命名(.c 和 .cxx)来实现。
  • 问题,但是:您希望编译器为文件param.cxx 假定什么语言?如果是 C,那么它的名字应该以.c 结尾,而不是.cxx
  • 这部分代码是用g++编译的。
  • @JohnBollinger,不幸的是我无法修改编译器调用,这对我来说是无法访问的。但是,我不认为这是一个编译器链接问题(我肯定错了):我尝试了这里描述的解决方案(stackoverflow.com/questions/8562694/…)并且它有效,但是一旦我调整它以遵循我的其余代码,不,不再是:')

标签: c function gcc header undefined


【解决方案1】:

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

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

#ifdef __cplusplus
extern "C" {
#endif

void 
grid_create(void);


#ifdef __cplusplus
}
#endif

【讨论】:

  • 谢谢你成功了!!但是我不太明白为什么在我正在使用的程序中已经存在的另一组 header/*.c 文件中,它使用相同的头声明?
  • 其他C文件是否调用grid_create()
  • 不是,而是一个类似定义的函数。实际上,我将这些其他函数的头文件复制/粘贴到一个新头文件中,然后简化此内容以创建我自己的函数,即 grid_create()
  • 不清楚这些 C 文件是否面临同样的问题。如果符号正在解析,则意味着链接器找到了已定义的符号。
猜你喜欢
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
相关资源
最近更新 更多