c - 对 `func()' 的 undefined reference

标签 c linux undefined-reference

我正在对现有的 linux c 项目进行一些更改。

/vobs/ua/HDL/VHDL/CmdUtil/src/help.c中,我这样定义func:

void func(){
...
}

在文件 /vobs/ua/HDL/Interface/cli/src/cliSystem.C 中,我写了这段代码:

extern void func();
...
void func1(){
  ...
  func();
  ...
}

在文件 /vobs/ua/HDL/VHDL/DsnMgr/src/shell.c 中,我这样写:

extern void func();
...
void func2(){
  ...
  func();
  ...
}

在文件 /vobs/ua/HDL/VHDL/DsnMgr/src/shell.c 中,我这样写:

extern void func();
...
void func2(){
  ...
  func();
  ...
}

在文件 /vobs/ua/HDL/VHDL/lib2v/src/asicLibCells.C 中,我这样写:

extern void func();
...
void func3(){
  ...
  func();
  ...
}

我没有在任何头文件中声明 func。

问题是在vobs/ua/HDL/Interface/cli/src/cliSystem.C和/vobs/ua/HDL/VHDL/lib2v/src/asicLibCells.C中调用func有错误

undefined reference to `func()'

但是对于/vobs/ua/HDL/VHDL/DsnMgr/src/shell.c,没有报错。

vobs/ua/HDL/Interface/cli/src/cliSystem.C/vobs/ua/HDL/VHDL/中声明 func 之后lib2v/src/asicLibCells.C 像这样:

extern "C" void func();

/vobs/ua/HDL/VHDL/lib2v/src/asicLibCells.C没有错误,但是vobs/ua/HDL/Interface/cli/src有错误/cliSystem.C 仍然存在。

怎么了?我该怎么做才能消除此错误?

最佳答案

问题是函数 func 是一个 C 函数,而您尝试从 C++ 函数中调用它。这是有问题的,因为 C++ 做了一些叫做 name mangling 的事情。允许函数重载之类的事情。

这意味着当你做你的声明

extern void func();

C++ 编译器将破坏该符号,并且将找不到该破坏的符号。

在 C++ 中,您必须禁止对来自 C 目标文件的函数进行名称重整。这是通过特殊的 extern 声明完成的:

extern "C" void func();

稍微相关一点,在 C 中有一个像这样的声明

void func();

并不意味着该函数不像在 C++ 中那样接受任何参数。在 C 中,该声明意味着 func 接受未指定数量的未指定参数。在 C 语言中,您必须使用 void 来声明一个不带参数的函数:

void func(void);

关于c - 对 `func()' 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43538517/

相关文章:

C++11,枚举类,g++ 的 undefined reference ,与 clang++ 一起工作

C - 对链接文件的函数错误的 undefined reference

c - 尝试循环数组时在 C 中出现异常错误

c - 在c中多次读取/proc/stats

c - 使用信号量的程序在 Linux 上运行良好...在 Mac osX 上出现意外结果

linux - 如何通过在 BASH 中使用新进程组 ID 在 Linux 上生成进程

c - 如何重置来自结构的数组

c - 未定义文件指针错误

php - 为 PHP-FPM 使用 HOSTALIASES

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?