我有一个调用某些库函数的程序。我可以成功地与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程序。
答案 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"
声明等迁移会出现问题。