你能从一个C应用程序链接一个c++库吗?

Can you link a C++ library from a C application?

本文关键字:一个 c++ 库吗 链接 应用程序      更新时间:2023-10-16

我使用我的g++交叉编译器交叉编译了一个开源库(基于c++)。我现在试图使用输出的。a文件在我的基于C的应用程序是使用我的GCC编译器构建的…这可能吗?

是。确保您想要使用的所有函数都是extern"C",并且仅在您想要使用的函数上使用基本类型。

如果你使用GCC和g++相同的版本,应该不会有任何问题。跨版本应该没问题,但可能有非常小的不兼容性。新的GCC(3.0+)符合Itanium ABI,所以它们会很好;他们就如何交换有一个二元协议。格式数据。

您需要确保从C代码调用的c++函数声明为extern "C",并且它们的接口只使用C可以处理的类型(简单类型,不透明指针等)。

您可能还需要将应用程序链接到c++编译器,而不是C编译器,以确保为c++库完成了正确的初始化。用于链接的c++编译器必须与用于生成库的编译器"相同"。这意味着使用相同版本的c++编译器或兼容版本的c++编译器。这通常意味着如果库是由CompilerB(来自供应商B)生成的,则不能链接到CompilerA(来自供应商A);c++运行时约定是这样的,不同的编译器(故意)使用不同的模式来支持c++的不同特性。

你可以将一个C应用程序链接到一个c++库,但是你只能在头文件中包含有效的C代码,而不是c++代码,而且你调用的任何c++函数都必须是用extern " c "声明的

你的问题的答案是"是",但正如其他人指出的那样,有一些考虑因素,危险&;限制你能做的事情& &;你是怎么做的

就在最近和一个客户讨论这个话题的过程中,我看到了一篇关于这个话题的很好的文章。本文讨论了诸如从c++代码调用C代码、从C代码调用c++代码、链接器注意事项、函数包装器、异常、链接规范以及从C访问c++类等内容。

Article: 在同一个程序中混合使用C和c++代码

如果c++库有c++接口,你不能直接使用它们,你将不得不创建包装器,这些包装器被编译为c++,但具有外部的"C"链接。这种包装器的复杂性将取决于接口的性质,仅使用c++特性(如类)和函数/操作符重载将需要将OO接口映射到过程接口。

要做到这一点,最简单、最省事的方法,假设您的C代码相当合理,就是简单地用g++构建您的C应用程序。

请记住,好的C代码几乎总是构建在c++编译器中。这样就不需要特别的考虑,不需要添加外部"C"语句,也没有ABI问题,等等,您可以轻松地充分使用c++库,而不管它的函数是如何声明的。