你能链接C应用程序的C ++库吗?

时间:2011-08-04 22:18:46

标签: c++ c static-linking

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

6 个答案:

答案 0 :(得分:2)

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

如果您使用与使用G ++相同的GCC版本,它绝对不会有任何问题。交叉版本应该没问题,但可能会有非常小的不兼容性。新的GCC(3.0+)符合Itanium ABI,因此它们会很好;他们就如何交换& amp;格式数据。

答案 1 :(得分:1)

您可以将C应用程序链接到c ++库, 但是你只能包含包含有效C - 而不是C ++代码的头文件, 并且您调用的任何c ++函数都必须使用extern“C”声明声明。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

你的问题的答案是肯定的,但正如其他人所指出的那样,有一些考虑因素,危害和问题。你能做什么的限制&你是怎么做的。

就在最近与客户讨论同一主题的过程中,我发现了一篇对该主题有相当好处理的文章。本文讨论的内容包括从C ++代码调用C代码,从C代码调用C ++代码,链接器注意事项,函数包装器,异常,链接规范以及从C等访问C ++类。

文章:Mixing C and C++ Code in the Same Program

答案 4 :(得分:0)

如果C ++库具有C ++接口,则无法直接使用它们,则必须创建编译为C ++但具有外部“C”链接的包装器。这种包装器的复杂性将取决于接口的自然性,使用C ++ - 只有类和函数/运算符重载等功能才需要将OO接口映射到过程接口。

答案 5 :(得分:-1)

最简单,最麻烦的方法这样做,假设你的C代码是合理的,是用g ++简单地构建你的C应用程序。

请记住,好的C代码几乎总是在C ++编译器中构建。然后没有特别的考虑,没有要添加的外部“C”语句,没有ABI问题等,并且无论如何声明其函数,您都可以轻松地使用C ++库。