0

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

先感谢您。

4

2 回答 2

6

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

举个例子,考虑以下为一些用 C++ 编写的mymagic.cc创建绑定: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++ 结构。当你需要从你的库中传递东西时,你应该使用指向不透明类型的指针。因此,在mymagic.h您的 C 代码也使用的标头中,您可以编写

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;
}
于 2012-08-01T08:43:42.040 回答
2

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

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

于 2012-08-01T08:42:03.050 回答