c++ - 最小化 Linux 共享库的依赖性

标签 c++ linux gcc c++11

我正在编写一个在 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。我不知道这些是什么。它们是旧的吗?如果是的话,它们是否长期向后兼容?如果是这样,我只会让它们保持动态链接,否则我必须继续调查。任何提示将不胜感激。

最佳答案

linux-gate.so.1 是一个虚拟 DSO,这意味着它实际上并不存在。解释它的最好方法就是阅读此链接 Here .

为了回答您的问题,我认为您最好的选择是继续动态链接到它们,并针对不同的发行版进行一些不同的构建。我发现通常当您为 Ubuntu 构建时,它可以在多个 Debian Linux 系统上运行。

关于c++ - 最小化 Linux 共享库的依赖性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18509089/

相关文章:

c++ - 将 Vector 与类一起使用时没有运算符错误

c++ - cvSVM 训练对 HOGDescriptor 的结果很差

linux - 在 Bash 中使用下划线 "_"无法正确打印文件名

c++ - g++ : which ways exist to find out which template specialization has been chosen by compiler?

c++ - C 中的结构封装

c++ - 有向无环图 : Updating the vertex property of a parent node by comparing the property of the child nodes.

c++ - usleep vs std::this_thread::sleep_for,在 linux 串行端口上写入/读取时

linux - 无法触摸 `/var/run/myfile/myfile.pid' : Permission denied

c - Mac OS X使用main和scanf/printf的32位nasm汇编程序?

c - gcc long long int 宽度与 int 相同