如何将静态库嵌入到共享库中?

How to embed a static library into a shared library?

在 linux 我正在尝试创建一个共享库,libbar.so,它嵌入了一个商业静态库(许可是好的)。商业库有4个版本:libfoo-seq.a、libfoo-mt.a、libfoo-seq.so和libfoo-mt.so(它们都提供相同的符号,只是代码是 sequential/multi-threaded,库是 static/shared)。在这四个中,我希望我的代码始终使用顺序 foo 库,所以当我创建 libbar.so 时,我 link 将我的目标文件和 libfoo-seq.a.

放在一起

问题是我的库的用户可能在他们拉入我的 libbar.so 时已经拉入了 libfoo-mt.so,因此 libfoo 中的所有符号都已经存在了libbar.so被读入,所以我对foo中的函数的调用解析为多线程版本。

我想知道如何解决这个问题?当我编译以创建我的目标文件时以及当我 link 我的目标文件与 libfoo-seq.a 以创建 libbar.so?

时,我需要使用什么样的魔法标志?

您可以通过版本脚本在 libbar 中隐藏 libfoo 的符号:

$ cat libbar.map
{
  global: libbar_*;
  local: libfoo_*;
};
$ gcc ... -o libbar.so -Wl,--version-script=libbar.map