当GCC成功时,G ++抱怨“未定义引用”

时间:2014-10-26 22:45:35

标签: c++ c gcc g++

我有一个调用某些库函数的程序。我可以成功地与GCC一起编译。但是,当我切换到G ++ 4.7时(因为我需要在其中添加C ++代码),我得到了

undefined reference to <a function name here>

编译命令如下:

<gcc or g++> foo.c -o foo <path-to-a-static-library>.a -l<the library>

包含我调用的函数的库由C编写。

我该如何解决?用G ++重新编译库?这很糟糕,因为我们有其他使用该库的C程序。

1 个答案:

答案 0 :(得分:1)

如果您可以更改C库的标题,则应使用适当的extern "C"部分保护它们:

#ifdef __cplusplus
extern "C" {
#endif

/* C declarations for the library */

#ifdef __cplusplus
}
#endif

如果绝对无法更改头文件,则应确保可以更改头文件。如果这绝对不是一个选择,那就更加努力。只有在击中阻力砖墙后,才会在extern "C"指令周围添加#include声明:

extern "C" {
#include "c-library-header.h"
}

extern "C"放在#include - 指令周围的方法的原因是它禁止将来迁移头文件以包含C ++特性:因为外部包含保护将围绕代码散布基础,当"c-library-header.h"中出现C ++特性时,修复它们就成了维护的噩梦。这可能不会被认为是当前软件的一个大问题,但任何成功的软件都会增长,并且删除extern "C"声明等迁移会出现问题。