【问题标题】:Compiling C and C++编译 C 和 C++
【发布时间】:2012-07-30 03:08:28
【问题描述】:

我有一个用 C 编写的程序,我需要使用用 C++ 编写的 KDIS 库。我在 KDevelop 中使用 automake&friends 编译我的 C 程序。我怎样才能把所有东西编译在一起?因为我想在我的 C 程序中调用一些 KDIS 函数。

提前谢谢你。

【问题讨论】:

  • 该库为您提供什么类型的接口? C 还是 C++?

标签: c++ c compilation


【解决方案1】:

如果您需要调用未声明 extern "C" 的 C++ 函数,那么您必须自己从 C++ 程序中执行此操作。您可以在项目中创建一个单独的 C++ 文件,该文件将您需要的所有库函数包装在 extern "C" 函数中,以供项目的其余部分使用。您必须告诉 autotools 您同时使用 C 和 C++。文件扩展名应该足以决定哪个是哪个。

举个例子,考虑以下mymagic.cc为一些用C++编写的libmagic创建绑定:

#include <libmagic/magic.hh>
extern "C" {
  int doMagic() {
    magic::Wizard w("foo", 42);
    magic::Result res = w.doMagic();
    return res.getResultCode();
  }
}

对于应用程序的其余部分,doMagic() 将显示为另一个 C 函数。但内部是 C++,所以它可以使用任何你想要的 C++ 结构。当你需要从你的库中传递东西时,你应该使用指向不透明类型的指针。所以在你的C代码也使用的标题mymagic.h中,你可以写

struct magicValue;
int doMagic(void);
struct magicValue* createMagic(void);
void destroyMagic(struct magicValue*);

mymagic.cc 中你会更明确:

struct magicValue {
    magic::value v;
    magicValue(magic::value val) : v(val) { }
};
magicValue* createMagic() {
    return new magicValue(magic::value("foo"));
}
void destroyMagic(magicValue*) {
    delete magicValue;
}

【讨论】:

  • 所以我应该用 extern “C++ 中的所有函数”创建一个 main.c。但是那个函数的参数是C++??
  • @dani:如果 KDIS 不提供 C 接口,那么您需要发明一个。如何实现这取决于您,但通常您会发现自己在 C 中定义不透明指针类型以引用 C++ 中的对象类型,并编写大量 ReturnType Foo_method(Foo *self, other args ...) { return self-&gt;method(other args...); } 形式的函数。
  • @dani,我不确定我是否理解您的评论。但我添加了一些例子,希望这能澄清事情。还可以查看链接 SingerOfTheFall provided,它们似乎有更多关于如何不仅调用函数而且在 C 和 C++ 之间以各种方式传递数据的详细信息。
  • @SteveJessop,如果您愿意,请随时编辑答案并包含您的示例。
【解决方案2】:

This link 可以帮助您了解如何在您的应用程序中混合使用 C 和 C++ 代码。

另外,看看this Stack Overflow 的问题,我相信这就是你所需要的。

【讨论】:

  • 在我看来,这个答案更适合作为评论而不是作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多