你能从一个C应用程序链接一个c++库吗?
Can you link a C++ library from a C application?
我使用我的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++库,而不管它的函数是如何声明的。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '