如何在C库中嵌入C ++库?

时间:2014-05-24 02:17:36

标签: c++ c linker static-linking

我有一个问题与将一个库嵌入另一个库有关。

我有一个纯C代码,我的用户依赖它,他们不想依赖C ++库。但是,需要将第三方库(ICU)嵌入到我的库中。没有ICU功能会被导出,它们只会在我的库内部使用。不幸的是,ICU是一个C ++库,虽然它有一个C包装器。 ICU不使用异常,但它确实使用RTTI(抽象基类)。

问题是如何创建静态库以便

  1. ICU嵌入在我的库中(所有对ICU函数的引用都在我的库中解析)
  2. 所有对libstdc ++的引用也已解决,必要的代码嵌入到我的库中
  3. 如果用户甚至没有在他们的系统上安装libstdc ++就可以正常工作
  4. 如果用户确实碰巧在C ++项目中使用我的库,则与他使用的libstdc ++(可能是系统libstdc ++)没有任何冲突。
  5. 这有可能吗?目标平台几乎都是:windows(我的库是动态的),以及所有类型的unix版本(linux,solaris,aix,hpux - 这里我的库需要是静态的)。

    gcc-4.5及更高版本确实有--static-libstdc ++,但据我所知,它仅用于创建共享库或可执行文件,而不是静态库。

    感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

此问题的解决方案非常简单,但可能不属于您设置的参数。

简单的规则是:

  1. 可以将C ++库动态链接到C调用者,但您必须将库包装在extern C层中。您设计extern C API并使用C ++内部实现它,它们永远隐藏在视图之外。 [您也可以使用COM或.NET在Windows上执行此操作。]
  2. 无法将C ++库静态链接到C调用方。库是不同的,调用序列/链接器符号是不同的。 [您通常甚至不能在同一编译器的不同版本之间静态链接,并且几乎从不在不同的编译器之间。]
  3. 换句话说,解决方案很简单:使用动态链接。如果这不是正确的答案,那么我认为没有。

    为了让事情变得有趣,您甚至可以实现自己的插件架构。这只是动态链接的另一个名称,但您可以选择API。


    为了清楚起见,我能看到的唯一可行的便携式选项是将ICU链接到自己的动态库(DLL或SO)中。它的符号,C ++库,RTTI和异常都保留在其中。你的静态lib链接到extern C的ICU动态库。这正是构建了多少Windows:C ++里面的DLL,extern C。

    您可以跨边界进行调试,但无法导出类型信息。如果需要这样做,则必须使用其他API,例如.NET或COM。

答案 1 :(得分:0)

我不知道这是否有用,但至少建议你尝试一下!

优秀的LLVM project(clang编译器的起源)有许多不同语言的前端和后端,例如C ++和C.根据this S.O. question,LLVM应该可以将C ++编译为C,然后可以正常编译。

我认为这条路线很崎岖,但如果它有效,它可以解决您的问题,而无需动态链接。这完全取决于ICU是否将使用LLVM C ++进行编译。

如果您决定试一试,请告诉我们您的情况!