我有一个用 C 编写的程序,我需要使用 KDIS用 C++ 编写的库。我在 KDevelop 中使用 automake&friends 编译我的 C 程序。我怎样才能将所有东西编译在一起?因为我想在我的 C 程序中调用一些 KDIS 函数。
提前谢谢你。
最佳答案
如果您需要调用未声明为 extern "C"
的 C++ 函数,则您必须自己从 C++ 程序执行此操作。您可以在项目中创建一个单独的 C++ 文件,将您需要的所有库函数包装在 extern "C"
函数中,以供项目的其余部分使用。您必须告诉 autotools 您正在使用 C 和 C++。文件扩展名应该足以决定哪个是哪个。
举个例子,考虑以下 mymagic.cc
为一些用 C++ 编写的 libmagic
创建绑定(bind):
#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 代码也使用的 header 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;
}
关于c++ - 编译 C 和 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11755549/