应用程序中是否存在两个相同库(具有相同名称)的不同版本?

时间:2010-12-27 14:50:07

标签: c linux shared-libraries

我有一些这样的场景:

产品>与平台> mylibs(版本-1)

产品> mylibs(版本2)

即产品直接使用mylibs(版本-2)。产品还使用平台(也是动态库),平台使用我的库(版本1)。

产品和平台使用的库的名称是相同的。只有版本不同,这两个版本都不兼容。

有没有办法用linux中的“.so”libs平台可以链接到一个版本,产品可以链接到同名的同名lib的另一个版本?

1 个答案:

答案 0 :(得分:6)

注意,默认情况下,即使更改lib的名称也不够,因为符号名称会发生​​冲突。 你的libs应该使用soname和versioned符号,在这种情况下它们甚至可以被称为相同的。

$ make
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.1 -Wl,--default-symver -o libmylibs.so.1 mylibs1.c
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.2 -Wl,--default-symver -o libmylibs.so.2 mylibs2.c
gcc -shared -fpic -Wl,-soname -Wl,libplatform.so.1  -Wl,--default-symver -Wl,--default-imported-symver -o libplatform.so.1 platform.c libmylibs.so.1
gcc  -Wl,-rpath-link -Wl,. -Wl,--default-imported-symver  -o program program.c libplatform.so.1 libmylibs.so.2
/usr/bin/ld: warning: libmylibs.so.1, needed by libplatform.so.1, may conflict with libmylibs.so.2
$ LD_LIBRARY_PATH=$PWD ldd ./program
    linux-vdso.so.1 =>  (0x00007fff1e3ff000)
    libplatform.so.1 => /tmp/so-4539442/libplatform.so.1 (0x00007f6dc3ba0000)
    libmylibs.so.2 => /tmp/so-4539442/libmylibs.so.2 (0x00007f6dc399f000)
    libc.so.6 => /lib/libc.so.6 (0x00007f6dc364c000)
    libmylibs.so.1 => /tmp/so-4539442/libmylibs.so.1 (0x00007f6dc344b000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f6dc3da1000)
$ LD_LIBRARY_PATH=$PWD ./program
lib version 2, platform lib version 1