C链接和c ++标头

时间:2012-01-11 09:44:01

标签: c++ c shared-libraries linkage

我想在C链接的共享库中使用一些c ++类。我遇到了以下问题。

如果

#include <iostream>
extern "C"
{
 void f(){}
}

成功编译和链接,但在结果库中找不到f()。

如果

extern "C"
{
#include <iostream>
 void f(){}
}

我遇到了很多编译器错误(只是不知道如何正确地将它们翻译成英文,有关C语言链接的模板)在iostream和包含的标题中出现的每个C ++关键字“template”。

应该做什么?

3 个答案:

答案 0 :(得分:4)

第一个变体是正确的。只有在C中存在的东西才能在extern "C"块中声明,模板和类肯定不属于该类别。您只需要确保,如果您使用的是C ++编译器,那么您的函数也会在标题中声明为extern "C"。这通常是通过编写

来实现的
#ifdef __cplusplus
// C++ declarations (for example classes or functions that have C++ objects
//                   as parameters)

extern "C"
{
#endif

// C declarations (for example your function f)

#ifdef __cplusplus
}
#endif
标题中的

答案 1 :(得分:2)

第一个是正确的;系统标头(以及大多数其他标头) 只能包含在全局范围内,任何名称空间,类之外, 功能或链接规范块。有可能的事情 在<iostream>中不合法的extern "C",即使 没有,extern "C"的名称几乎可以肯定 不同于C ++,并且库本身肯定是编译的 为extern "C++"

您是如何定义f的?这可能是一个类似的问题:如果来源 file将其编译为extern "C++"函数,然后名称将为。{ 与编译它的客户端文件中的版本不同 extern "C"函数。

这里的一般政策是处理标题和功能 定义/声明的方式与通常相同,除了 确保标头可以包含在C和C ++源中, e.g:

#if __cplusplus
extern "C" {
#endif
void f();
//  Other `extern "C"` functions...
#if __cplusplus
}
#endif

然后在使用函数f()的所有文件中包含此标头, 并在定义它的文件中。

答案 2 :(得分:0)