【发布时间】:2012-07-30 03:08:28
【问题描述】:
我有一个用 C 编写的程序,我需要使用用 C++ 编写的 KDIS 库。我在 KDevelop 中使用 automake&friends 编译我的 C 程序。我怎样才能把所有东西编译在一起?因为我想在我的 C 程序中调用一些 KDIS 函数。
提前谢谢你。
【问题讨论】:
-
该库为您提供什么类型的接口? C 还是 C++?
标签: c++ c compilation
我有一个用 C 编写的程序,我需要使用用 C++ 编写的 KDIS 库。我在 KDevelop 中使用 automake&friends 编译我的 C 程序。我怎样才能把所有东西编译在一起?因为我想在我的 C 程序中调用一些 KDIS 函数。
提前谢谢你。
【问题讨论】:
标签: c++ c compilation
如果您需要调用未声明 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;
}
【讨论】:
ReturnType Foo_method(Foo *self, other args ...) { return self->method(other args...); } 形式的函数。