c++ - 如何对使用 Linux 的 GCC 创建的共享对象文件进行版本控制

标签 c++ c version shared-libraries

如何对使用 GCC for Linux 创建的共享对象文件进行版本控制

请用几个例子解释一下

最佳答案

您的 LD_LIBRARY_PATH 中可以存在多个版本的共享库。

例如:

/usr/lib/libform.so -> libform.so.5
/usr/lib/libform.so.5 -> libform.so.5.9
/usr/lib/libform.so.5.9
/usr/lib/libform.so.6 -> libform.so.6.0
/usr/lib/libform.so.6.0

上面的示例中存在符号链接(symbolic link),因为在链接时如果您只提及 -lform,它会根据符号链接(symbolic link)自动为您选择正确的库。

当二进制文件链接到一组共享库时,它将请求该库的特定版本。可以使用 ldd 找出二进制文件所依赖的库列表

$ ldd /usr/bin/python
    linux-vdso.so.1 (0x00007ffffa5fe000)
    libpython2.7.so.1.0 => /usr/lib64/libpython2.7.so.1.0 (0x00007ff6e9b6c000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff6e9950000)
    libc.so.6 => /lib64/libc.so.6 (0x00007ff6e95ab000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007ff6e93a7000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00007ff6e91a4000)
    libm.so.6 => /lib64/libm.so.6 (0x00007ff6e8ead000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ff6e9f0a000)

在上面的示例中,python 依赖于 libm.so.6 而不仅仅是 libm.so

库文件名中的版本控制通常采用以下形式:

libSOMETHING.so.VERSION
libSOMETHING.so.MAJOR_VERSION.MINOR_VERSION

有些库有时也有次要编号或补丁编号。

每个库都在库中嵌入一个名为 soname 的字符串,编译时和运行时链接器都会检查版本兼容性。

例如,针对 libform.so.5 编译的二进制文件将适用于 libform.so.5.9libform.so.5.9.1但由于主要版本号发生了变化,libform.so.6 则不然。

要将 soname 信息构建到库中,您需要执行以下操作:

gcc -fPIC -shared -Wl,-soname,libfoo.so.1  -o libfoo.so.1.0.0 foo.c bar.c baz.c

来自 ld 的手册页:

-soname=name
 When creating an ELF shared object, set the internal DT_SONAME
 field to the specified name.  When an executable is linked with
 a shared object which has a DT_SONAME field, then when the
 executable is run the dynamic linker will attempt to load the
 shared object specified by the DT_SONAME field rather than the
 using the file name given to the linker.

关于c++ - 如何对使用 Linux 的 GCC 创建的共享对象文件进行版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15264693/

相关文章:

ios - Apple 是否规定 iOS 应用程序必须使用哪个 SDK 版本?

java - 用ant编译时出现异常

c++ - 对于大于 4GiB 的文件,fread 有时会返回错误值

c - 如何从二进制文件中检索二进制版本号

c++ - qt Creator qt5.1 vs2010使用静态库时链接器错误

c++ - 转换为 void 的双指针地址**

c++ - 回调到 COM 对象的 powershell 函数

C++11 资源和编译器

python - 获取 Mac 空闲时间 C 或 Python

c - 这两段代码的工作