我有一个用 C 编写的程序,我需要使用用 C++ 编写的KDIS库。我在 KDevelop 中使用 automake&friends 编译我的 C 程序。我怎样才能把所有东西编译在一起?因为我想在我的 C 程序中调用一些 KDIS 函数。
先感谢您。
我有一个用 C 编写的程序,我需要使用用 C++ 编写的KDIS库。我在 KDevelop 中使用 automake&friends 编译我的 C 程序。我怎样才能把所有东西编译在一起?因为我想在我的 C 程序中调用一些 KDIS 函数。
先感谢您。
如果您需要调用未声明的 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;
}