我正在编写一个我在Windows,Linux和Mac下部署的共享库。在Linux方面,我试图确保我的库具有尽可能少的依赖项。我不希望最终开发人员担心我的库在内部使用什么,特别是我不想强迫他们安装任何东西。
此刻,当我在我的图书馆运行ldd时,我看到了:
linux-gate.so.1 => (0xf57fe000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb773d000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb7654000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74a1000)
/lib/ld-linux.so.2 (0xb7782000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb745d000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7440000)
这对我来说看起来相当合理,但其中一些库我并不确定它们是什么。谁能告诉我这个依赖列表是否合理,或者我是否可以摆脱其中的一些?有了这个依赖项列表,我的库是否可以在各种Linux配置和发行版上运行?这就是我的目标,最大的便携性。
编译时,我指定标志-static-libgcc。例如,我还可以指定在C ++标准库中指定链接的标志吗?在我的库中,我的库在C ++ 11中使用std :: thread,但我不想强制应用程序编写者必须具有可用的(例如,如果他们使用旧版本的GCC)。
更新
我现在除了-static-libgcc之外还指定了-static-libstdc ++。我的依赖列表现在看起来如下:
linux-gate.so.1 => (0xf57fe000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb7737000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7584000)
/lib/ld-linux.so.2 (0xb77a2000)
唯一引起我关注的是libc.so.6和linux-gate.so.1。我不知道这些是什么。它们是旧的,如果是这样的话,它们长时间保持向后兼容吗?如果是这样,我会让他们动态链接,但否则我必须继续调查。任何提示将不胜感激。
答案 0 :(得分:1)
linux-gate.so.1是一个虚拟DSO,意味着它并不存在。解释它的最佳方法是阅读此链接Here。
要回答您的问题,我认为您最好的选择是继续动态链接到它们,并执行一些不同的构建以针对不同的发行版。我发现通常在为Ubuntu构建时,它可以在几个Debian linux系统上运行。