我有一个问题与将一个库嵌入另一个库有关。
我有一个纯C代码,我的用户依赖它,他们不想依赖C ++库。但是,需要将第三方库(ICU)嵌入到我的库中。没有ICU功能会被导出,它们只会在我的库内部使用。不幸的是,ICU是一个C ++库,虽然它有一个C包装器。 ICU不使用异常,但它确实使用RTTI(抽象基类)。
问题是如何创建静态库以便
这有可能吗?目标平台几乎都是:windows(我的库是动态的),以及所有类型的unix版本(linux,solaris,aix,hpux - 这里我的库需要是静态的)。
gcc-4.5及更高版本确实有--static-libstdc ++,但据我所知,它仅用于创建共享库或可执行文件,而不是静态库。
感谢您的帮助!
答案 0 :(得分:4)
此问题的解决方案非常简单,但可能不属于您设置的参数。
简单的规则是:
换句话说,解决方案很简单:使用动态链接。如果这不是正确的答案,那么我认为没有。
为了让事情变得有趣,您甚至可以实现自己的插件架构。这只是动态链接的另一个名称,但您可以选择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 ++进行编译。
如果您决定试一试,请告诉我们您的情况!