【问题标题】:How to create a linux shared library including all binary dependencies into a single so file?如何创建一个包含所有二进制依赖项的linux共享库到一个so文件中?
【发布时间】:2018-01-06 17:02:04
【问题描述】:

我可以在 linux libMySharedLibrary.so 中创建一个共享库。

但是我在编译时包含了一堆引用其他库的头文件。我想链接这些包含的头文件中的所有二进制代码,以便我可以将我的共享库分发到一个 .so 文件中。

我正在使用 gcc 进行编译。命令行下方:

gcc -I$JAVA_8_HOME/include/ -I$JAVA_8_HOME/include/linux/ -I./include/ -I. -fPIC -o libMyLibrary.so -shared com__MyLibrary.c

头文件在./include 中。我需要将生成的 libMyLibrary.so 与 ./include 中的头文件的二进制文件链接起来。

怎么做?

【问题讨论】:

  • 编辑您的问题以解释为什么您想这样做。闻起来像一些XY problem。所以你应该给出你的动机和背景。
  • 如果您拒绝让您的共享库依赖于任何其他人,为什么您希望其他人愿意链接到您的共享库?

标签: c++ linux gcc linker


【解决方案1】:

我想链接这些包含的头文件中的所有二进制代码,以便我可以将我的共享库分发到一个 .so 文件中。

你不能做你想做的事(这违背了共享库的整体理念,正如它们的名字所暗示的那样,它们是共享 在几个processes 和“加载”到它们的virtual address space 之间由dynamic linker)。

您应该阅读 Drepper 的 How To Write Shared Libraries 论文和 Program Library HowTo。另见ld-linux(8) & elf(5) & objdump(1) & readelf(1) & ld(1) & ldd(1)。阅读Invoking GCC

为了简化您的软件的分发,您可能希望构建一些针对某些package manager 的包(例如.deb 一个)。您可以将源代码发布为free software(例如github)。

您可以(也许应该)将其他较低级别的共享库与您自己的共享库链接。但是您的用户仍然需要安装这些库。例如,你可以编译

 gcc -Wall -O -g -I$JAVA_8_HOME/include/ -I$JAVA_8_HOME/include/linux/ \
     -I./include/ -I. -fPIC -o libMyLibrary.so \
     -shared com__MyLibrary.c -lother

并检查ldd libMyLibrary.so,它依赖于一些libother.so.*(您的用户应该安装它以使用您的libMyLibrary.so)。

您可以将您正在使用的所有代码(如position-independent code) - 包括“其他库”的源代码 - 编译成一个单个共享库,但不建议这样做(如果您这样做,一个程序实际上可以不使用它上面的几个共享库中的一些共享低级函数)。

您还需要了解库不是一组头文件,即了解linkerpreprocessor 的作用。头文件只是(部分地)描述了某些 C 或 C++ 库的API。另请阅读 Levine 的 Linkers and Loaders 书。在实践中,头文件声明一些东西(类、函数、变量、类型...)并且可能定义inline functions(但不是全局的)。您需要了解translation units 是什么。

借助/proc/ 文件系统(参见proc(5)),您可以了解某个给定进程的虚拟地址空间。例如,在终端中尝试cat /proc/$$/maps

您可能会阅读一些 Linux 编程书籍,可能是旧的 ALP(可免费下载)或更新的书籍。您可以阅读一些关于操作系统的教科书,例如Operating Systems: Three Easy Pieces(也可以免费下载)。

还可以从source code现有 free software 库的构建过程中寻找灵感(例如,来自您的 Linux 发行版、github 或其他地方)。您应该考虑使用一些build automation 工具(例如GNU makeninja)来构建您自己的库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 2014-06-17
    • 2019-11-02
    • 2016-01-13
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多