2013-06-18 103 views
0

我有一个动态库lib_funcs.so,用C语言编写当我把它链接到一个C项目(代码.so库: :Blocks)一切正常,但是当我将它链接到一个C++项目并使用这个库的函数Code :: Blocks时出现错误:undefined reference to 'functions name'使用C *在C .so库++项目(Ubuntu的)使用C *在C项目(Ubuntu的)

+0

为什么你重新发布**完全相同的问题!** – 2013-06-18 22:47:56

+0

因为你没有给我答案 –

+0

** Wat?** [你认为这是什么?](http:// stackoverflow.com/questions/17179797/ubuntuusing-c-so-library-in-c-project#comment24877125_17179797)[和这?](http://stackoverflow.com/questions/17179797/ubuntuusing-c-so-library-在-C-项目#comment24877138_17179797)这个呢?(http://stackoverflow.com/questions/17179797/ubuntuusing-c-so-library-in-c-project#comment24877182_17179797) – 2013-06-19 15:59:36

回答

0

您需要定义原型为extern "C" { prototypes },防止名字改编。

+0

,我需要定义原型? –

+0

在你的头文件中。在定义任何原型之前,您可以在头文件中将语句添加为'#ifdef __cplusplus extern C {#endif',并在最后添加另一个为'#ifdef __cplusplus}#endif'。 – unxnut

4

当包括声明的功能的标题,换行列入一个extern "C"块。

extern "C" { 
#include "funcs.h" 
} 

C++使用名称重整支持函数重载(其中重命名功能,包括有关类型及其参数,以及信息),而C只是使用你给函数的名称。所以你的C++代码正在寻找他们的名字下的函数,而不是他们的真名。如果围绕函数的声明使用extern "C",那会导致C++编译器使用C风格的命名约定,而不是C++。

+0

我试过这个,但它没有帮助 –

+0

@PetrLivic我第一次弄错了,它应该是'extern“C”'带引号。尝试一下;如果它不起作用,你能否粘贴一个不起作用的简短完整例子,以及你在问题中遇到的确切错误? –

+0

你的意思是 extern“C”void ....; extern“C”void 2 ...; –