2014-10-26 48 views
0

我有一个程序,它调用某些库函数。我可以成功编译GCC。然而,当我切换到G ++ 4.7(因为我需要添加在它的C++代码),我得到G ++抱怨“未定义的引用”,而GCC成功

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程序使用该库。

+7

名称mangling !!!查找'extern“C”'... – 2014-10-26 22:47:07

+0

@πάνταῥεῖThx。我搜索了一个结果,如“如果需要在C++中使用,C代码头应该包含在extern中”。那么,如果图书馆没有那个外部C,我什么都不能做? – 2014-10-26 23:01:53

+2

@PengZhang do'extern“C”{“{”} #include“library.h” }'您的C++代码 – 2014-10-26 23:04:43

回答

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 -directive的原因是,它抑制了头文件包括C++功能的未来迁移:由于外部包含守卫将围绕代码库散布,因此当C++功能出现在"c-library-header.h"中时,它将成为修复它们的维护噩梦。这可能不是当前软件的一个大问题,但任何成功的软件往往会增长,并且像删除extern "C"声明这样的迁移会变得有问题。