如何从C调用用C ++编写的lib?

在我看来,这似乎是一个明智的选择,但我找不到任何反对或为此的信息。

从demangling等的角度来看,我不认为这是一个大问题,但我无法弄清楚,我怎么能写一个小C程序从一个小小的C ++库调用一个函数。

我现在在linux上,尝试使用静态绑定。

这一定是许多人遇到的问题,或许多书籍所涵盖的内容,但我觉得这个问题就像一个盲目的傻瓜。 有趣的是,SO也没有这样的问题。

我甚至不知道如果这可以工作,那么必须如何做得更少。

通常,您需要强制C ++编译器为导出的函数构建具有C链接的库。

您可以通过对标题执行以下操作来执行此操作:

 #ifdef __cplusplus extern "C" { #endif void func(void); /* ... Other function defs go here ... */ #ifdef __cplusplus } #endif 

通常,链接器将对函数进行C ++名称修改,以便C链接器无法找到它们。 extern "C"迫使它不这样做。 你需要将它包装在#ifdef ,因为extern "C"在C中无效。

UPDATE

正如Charles Salvia在下面的评论中所说,你需要确保没有exception通过你的界面出来,因为C无法处理它们(至少不是与平台无关的方式)。

如果C ++库没有提供C接口,那么你就不能。

如果是,请使用C接口。

如果您是作者,请使用extern "C"function。 http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

就个人而言,我写了一个C ++文件,导出使用C链接的函数。 换句话说,写一个绑定。

在Linux上,您可以使用该命令获取C ++函数的错位名称

 nm my-tiny-c++lib.a 

通过它的受损名称从C调用该函数,但不要指望这个技巧是可移植的……

编辑 :然后你必须使用g ++或gcc -lstdc ++进行链接

从解码的角度来看这是一个问题。 在要从C调用的C ++周围使用extern C.

在C ++中, Mangling和de-mangling从未标准化,因为它被认为太依赖于平台。 结果是,虽然您可以通过查看链接器输出来找出C ++方法的方法名称,但是没有可移植的方法来查找C ++函数方法的“真实”可链接名称。

您可以在任何具有C ++ API的C ++库周围编写C包装器。 包装器应该用C ++编写。

您甚至可以使用C ++类。 你将它们声明为struct。 如果您执行此操作,某些编译器会发出警告,但您可以禁用此警告或忽略它。

您现在创建自由函数来创建指向此类结构的指针(不是实例,因为您没有看到它的完整定义),并通过将其作为参数来处置此类指针及其所有方法。

请注意,如果该类位于命名空间中,您将无法执行此操作,因此请创建自己的结构,该结构只包含该成员并使用该“包装器”。

适用于所有Cfunction。 在标题中,放

 #ifdef __cplusplus extern "C" { #endif // all your functions #ifdef __cplusplus } #endif 

典型的包装器看起来像这样:

—- class_a.hpp —-

 #include "class_a_wrapper" class A { public: int foo(double p); double bar(int x, int y); } 

—- class_a_wrapper.h —-

 #ifdef __cplusplus extern "C" { #endif struct wrap_A; int wrap_A_foo(struct wrap_A *obj, double p); double wrap_A_bar(struct wrap_A *obj, int x, int y); #ifdef __cplusplus } #endif 

—- class_a_wrapper.cpp —-

 #include "class_a.hpp" int wrap_A_foo(struct wrap_A *obj, double p) { return (static_castobj)->foo(p); } double wrap_A_bar(struct wrap_A *obj, int x, int y) { return (static_castobj)->bar(x, y); }