gpt4 book ai didi

c++ - 如何创建一个Linux共享库,将所有二进制依赖项包含到一个so文件中?

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:19 27 4
gpt4 key购买 nike

我能够在 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 内的头文件的二进制文件链接。

如何?

最佳答案

I want to link all the binary code from these included header files so I can distribute my shared library in one .so file.

你不能做你想做的事情(这违背了共享库的整个理念,顾名思义,共享库在多个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 .

为了简化软件的分发,您可能需要构建一些针对某些 .deb 的软件包(例如 package manager 一个) 。您可以将源代码发布为 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 ) - 包括“其他库”的源代码 - 编译到单个共享库中,但不建议这样做(如果您这样做,程序实际上可能无法使用其上方的几个共享库中的某些共享低级函数)。

您还需要了解库不是一组头文件,即了解 linker 的作用和 preprocessor 。头文件仅描述(部分)API一些 C 或 C++ 库。另请阅读 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 )来构建您自己的库。

关于c++ - 如何创建一个Linux共享库,将所有二进制依赖项包含到一个so文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48129696/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com