在c中包装一个c ++库? (不要“extern c”)

是否可以将c ++库包装到c中?

我怎么能这样做?

有没有现有的工具?

(需要访问现有的c ++库,但只能访问C)

您可以在C中编写面向对象的代码,因此如果它是面向对象的C ++库,则可以将其包装在C接口中。 但是,这样做可能非常繁琐,特别是如果您需要支持inheritance,虚函数等等。

如果C ++库使用通用编程(模板),它可能会变得非常毛茸茸(你需要提供所有需要的模板实例)并快速接近它不值得这样做的地步。

假设它是OO,这里是一个如何在C中执行OO的基本草图:

C ++类:

 class cpp { public: cpp(int i); void f(); }; 

C界面:

 #ifdef __cplusplus extern "C" { #endif typedef void* c_handle; c_handle c_create(int i) { return new cpp(i); } void c_f(c_handle hdl) { static_cast(hdl)->f(); } void c_destroy(c_handle hdl) { delete static_cast(hdl); } #ifdef __cplusplus } #endif 

根据您的要求,您可以修改它。 例如,如果这将成为私有C ++ API的公共C接口,那么将实际指针作为句柄分发可能会使其易受攻击。 在这种情况下,您将分发基本上是整数的句柄,将指针存储在句柄到指针映射中,并通过查找替换强制转换。

使函数返回字符串和其他动态大小的资源也可以变得非常精细。 你需要C调用者提供缓冲区,但它不能事先知道大小。 然后,某些API(如WIn32 API的某些部分)允许调用者使用长度为0的缓冲区调用此类函数,在这种情况下,它们返回所需缓冲区的长度。 但是,这样做可能会使通过API的调用非常低效。 (如果在算法执行后只知道所需缓冲区的长度,则需要执行两次。)
我过去做过的一件事就是将句柄(类似于上面代码中的句柄)分发给内部存储的字符串,并提供一个API来询问所需的缓冲区大小,检索提供缓冲区的字符串,并销毁handle(删除内部存储的字符串)。
这是一个真正的PITA使用,但这是C.

编写一个执行extern c的c ++包装器,用c ++编译,然后调用你的包装器。

(不要“extern c”)

extern C只能帮助你在dll中拥有一个像你看到的那样的名字。

您可以使用
dumpbin /EXPORTS your.dll
看看extern C或没有它的名字会发生什么。
http://msdn.microsoft.com/en-us/library/c1h23y6c(v=vs.71).aspx

回答你的问题……这取决于……但你不可能在没有包装的情况下使用它。 如果这个C ++库只使用一个简单的函数和类型,你可以使用它。 如果这个C ++库使用复杂的类结构 – 可能你将无法在没有包装的情况下从C中使用它。 这是因为类的内部可能以某种方式构造,这取决于许多条件(使用虚拟表或抽象的推理。或者在示例中,复杂的C ++库可能有自己的对象创建机制,因此您必须以它的方式使用它设计或你会得到不可预测的行为)。

所以,我认为,你必须做好准备做圆顶包装。

这是一篇关于包装C ++类的好文章。 作者讲述了将C ++类包装到C#中的文章,但他在第一步使用了C语言。
http://www.codeproject.com/KB/cs/marshalCPPclass.aspx

如果编写的C ++库可以使用C编译器编译并进行轻微编辑(例如将bool更改为int ,将false更改为0并将true更改为1等),那么就可以完成。

但并非所有C ++代码都可以用C语言包装。模板是C ++中的一个无法包装的function,或者几乎不可能。

将它包装在调用该dll的C ++ cpp中,并在您创建的文件中包含“extern C”。