我使用我的G ++交叉编译器交叉编译了一个开源库(基于C++)。我现在试图在我的GCC编译器构建的基于C的应用程序中使用输出的.a文件......这可能吗?你可以从C应用程序链接一个C++库吗?
回答
是的。确保您要使用的所有函数都是extern“C”,并且您只对要使用的函数使用基本类型。
如果您使用与G ++相同的GCC版本,那肯定不会有任何问题。跨版本应该没问题,但可能会有很小的不兼容性。新的GCC(3.0+)符合安腾ABI,因此它们会很好;他们就如何交换&格式数据达成了二元协议。
您可以将C应用程序链接到一个C++库, 但你只能包括含有效C头文件 - 而不是C++ - 代码, 使用任何C++调用必须声明与外部的“C函数“ 宣言。
最简单,最简单的方法要做到这一点,假设您的C代码是相当理智的,就是简单地使用g ++构建您的C应用程序。请记住,好的C代码几乎总是以C++编译器为基础构建的。那么就没有特别的考虑,不需要添加外部“C”语句,也不需要ABI问题等,并且无论函数如何声明,都可以轻松使用C++库。
您需要确保从C代码调用的C++函数声明为extern "C"
,并且它们的接口只使用可以由C处理的类型(简单类型,不透明指针等)。
您可能还需要将应用程序与C++编译器(而不是C编译器)链接,以确保为C++库执行了正确的初始化。用于链接的C++编译器必须与用于生成库的C++编译器'相同'。这意味着要么是相同版本的C++编译器,要么是它的兼容版本。这通常意味着如果库是由CompilerB(来自供应商B)生成的,则无法与CompilerA(来自供应商A)链接; C++运行时约定是这样的,不同的编译器(故意地)使用不同的方案来支持C++的不同特性。
如果C++库具有C++接口,您不能直接使用它们,则必须创建编译为C++但具有外部“C”链接的包装。这种包装的复杂性将取决于界面的特性,使用C++ - 只有诸如类的特性以及函数/运算符重载将需要将OO接口映射到过程接口。
您的问题的答案是“是”,但正如其他人指出的那样,有一些注意事项,对您可以执行的操作的限制& &您是如何做到的。
就在最近与客户讨论这个话题的过程中,我遇到了一篇文章,对这个话题的处理非常好。文章论述了像调用C代码C++代码,从C代码,连接器方面的考虑,功能包装,异常联动规范调用C++代码,以及在C访问C++类等
- 1. 你可以从MS SQL Server调用C++应用程序吗?
- 2. (C++)你可以添加一个直接链接到一个C + +程序出GUI吗?
- 3. 可以从C++/CX应用程序调用OpenCV库吗?
- 4. 链接C#类库与应用程序
- 5. 你可以在C++程序中创建一个.java文件吗?
- 6. 你可以让一个C#应用程序自动添加帖子给Yammer吗?
- 7. 一个c#控制台应用程序也可以作为一个类库吗?
- 8. C#WinForm应用程序可以使用远程MySQL连接吗?
- 9. 你可以在一个.NET应用程序中SSL一页吗?
- 10. 你可以从C/C++调用Objective-C方法吗?
- 11. 我可以使用应用程序作为库(Mac,Objective-c)吗?
- 12. 您可以将C++ Linux针对的应用程序链接到Objective-C静态库吗?
- 13. 你可以静态编译一个cygwin应用程序吗?
- 14. 你可以让一个贴纸应用程序有声音吗?
- 15. 你可以用链接调用一个servlet吗?
- 16. 链接一个C++应用程序再DLL一个
- 17. 你可以在Cocoa(Obj-C)项目中使用C++库吗?
- 18. 如何链接SunriseDD C库与C++应用程序?
- 19. 如何静态链接C/C++应用程序中的库?
- 20. 从Qt应用程序链接到C++静态库
- 21. 你可以在Dart应用程序中使用Java库吗?
- 22. 我可以在C程序中使用C++库吗?
- 23. C/C++应用程序可以使用OpenCL吗?
- 24. 链接一个C++库:Restbed
- 25. 你可以从C结构与位域创建一个NSValue吗?
- 26. 您可以在C++/CLI WinForms应用程序中本地使用C++库吗?
- 27. 我可以在C++ 11客户端应用程序库中使用C++ 14吗?
- 28. C++静态库可以链接到共享库吗?
- 29. 链接C++库,以便它可以调用C
- 30. 你可以从C DLL调用C#DLL吗?
在我的测试中,我需要添加'-lstdC++'来让程序链接。 –