Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何对使用GCC for Linux创建的共享对象文件进行版本设置_C++_C_Version_Shared Libraries - Fatal编程技术网

C++ 如何对使用GCC for Linux创建的共享对象文件进行版本设置

C++ 如何对使用GCC for Linux创建的共享对象文件进行版本设置,c++,c,version,shared-libraries,C++,C,Version,Shared Libraries,如何对使用GCC for Linux创建的共享对象文件进行版本设置 请用几个例子解释一下在您的LD_library_路径中可能存在多个版本的共享库 例如: /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

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


请用几个例子解释一下

在您的LD_library_路径中可能存在多个版本的共享库

例如:

/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
上述示例中存在符号链接,因为在链接时,如果您只提到
-lform
,它会自动根据符号链接为您选择正确的库

当二进制文件链接到一组共享库时,它将请求库的特定版本。二进制文件所依赖的库列表可以使用
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.9
libform.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还是C++(GNUC编译器还是GNU编译器集合)?你试过什么?你研究了什么?你还看了哪些对你没有帮助的问题?我认为这个问题太宽泛了。我们将在Linux环境中部署一个C++共享对象文件,它是用不同版本的文件来区分文件。