gpt4 book ai didi

c++ - 如何将 C++ 库嵌入到 C 库中?

转载 作者:可可西里 更新时间:2023-11-01 17:56:52 28 4
gpt4 key购买 nike

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

我有一个纯 C 代码,我的用户依赖它,他们不想依赖 C++ 库。但是,需要将第 3 方库 (ICU) 嵌入到我的程序中。不会导出任何 ICU 函数,它们只会在我的库内部使用。不幸的是,ICU 是一个 C++ 库,尽管它确实有一个 C 包装器。 ICU 不使用异常,但它确实使用 RTTI(抽象基类)。

问题是我怎样才能创建我的静态库,这样

  1. ICU 嵌入到我的库中(所有对 ICU 函数的引用都在我的库中解析)
  2. 所有对 libstdc++ 的引用也已解决,必要的代码已嵌入到我的库中
  3. 如果用户甚至没有在他们的系统上安装 libstdc++,一切正常
  4. 如果用户碰巧在 C++ 项目中使用我的库,那么与他使用的任何 libstdc++(大概是系统 libstdc++)都没有冲突。

这可能吗?目标平台几乎无所不包:windows(我的库是动态的)和各种 unix 版本(linux、solaris、aix、hpux - 我的库需要是静态的)。

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

感谢您的帮助!

最佳答案

这个问题的解决方案很简单,但可能不在您设置的参数范围内。

简单的规则是:

  1. 可以将 C++ 库动态链接到 C 调用程序,但您必须将库封装在一个外部 C 层中。您设计外部 C API 并使用永远隐藏在 View 之外的 C++ 内部实现它。 [您也可以使用 COM 或 .NET 在 Windows 上执行此操作。]
  2. 不能将 C++ 库静态链接到 C 调用程序。库不同,调用序列/链接器符号也不同。 [您通常甚至不能在同一编译器的不同版本之间进行静态链接,而且几乎不能在不同的编译器之间进行链接。]

换句话说,解决方案很简单:使用动态链接。如果这不是正确答案,那么我认为没有答案。

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


需要说明的是,我能看到的唯一可行的可移植选项是将 ICU 链接到它自己的动态库(DLL 或 SO)中。它的符号、C++ 库、RTTI 和异常都在其中。您的静态库通过 extern C 链接到 ICU 动态库。这正是构建了多少 Windows:C++ inside DLL,extern C。

可以越界调试,但是不能导出类​​型信息。如果您需要这样做,您将不得不使用不同的 API,例如 .NET 或 COM。

关于c++ - 如何将 C++ 库嵌入到 C 库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23840705/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com