我有一个用C编写的程序,我需要使用用C ++编写的KDIS库。我在KDevelop中与automake& friends编译我的C程序。我怎么能一起编译所有东西?因为我想在我的C程序中调用一些KDIS函数。
提前谢谢。
答案 0 :(得分:6)
如果需要调用未解析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;
}
答案 1 :(得分:2)