Linux程序试图同时加载两个不同版本的共享库

时间:2015-03-16 16:37:03

标签: g++ shared

我的问题听起来有点奇怪

我已经构建了一个名为libJsonCpp.so的库,我在一些程序中使用了它,现在我只是增加了该库的修订版号,从2.12增加到2.13。

[enzo@P0101222 Test]$ ls -la /prd/b_BCM/bin/libJsonCpp.so*
lrwxrwxrwx    1 enzo     aesys          18 Mar 16 16:52 /prd/b_BCM/bin/libJsonCpp.so -> libJsonCpp.so.2.13
lrwxrwxrwx    1 enzo     aesys          18 Mar 16 14:26 /prd/b_BCM/bin/libJsonCpp.so.2 -> libJsonCpp.so.2.13
lrwxrwxrwx    1 enzo     aesys          22 Mar 16 14:26 /prd/b_BCM/bin/libJsonCpp.so.2.13 -> libJsonCpp.so.2.13.001
-rwxr-xr-x    1 enzo     aesys      286939 Mar 16 14:26 /prd/b_BCM/bin/libJsonCpp.so.2.13.001

奇怪的是,使用这个库的程序试图加载它两次,新的reivison和旧的

当我检查程序以查看它所需的库时,我有一个这样的输出:

  [enzo@P0101222 MySampleProgram]$ ldd MySampleProgram
        libJsonCpp.so.2.13 => /prd/b_BCM/bin/libJsonCpp.so.2.13 (0x4002a000)
        libxerces-c-3.0.so => /usr/local/lib/libxerces-c-3.0.so (0x40061000)
        libnsl.so.1 => /lib/libnsl.so.1 (0x40438000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x4044c000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x40461000)
        ...... 
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
        libJsonCpp.so.2.12 => not found

如您所见,程序会查找新库(正确)

libJsonCpp.so.2.13 => /prd/b_BCM/bin/libJsonCpp.so.2.13

但也适用于旧的,当然已被删除

    libJsonCpp.so.2.12 => not found

我已经检查了所有系统,发现仍然应该引用旧版本,但我什么也没找到。 我还重建程序e删除缓存文件,但问题仍然存在。

所以我问是否有人建议检查一下这个奇怪的问题。

关心,恩佐

于2015年3月17日增加 在程序的链接过程中,我有以下错误: 似乎链接/prd/b_BCM/bin/libJsonCpp.so指向旧版本,但链接都链接到新版本(见上文)

g++ -Wcast-qual -Wshadow -Wcast-align -Wnon-virtual-dtor -Wno-long-long -Wbad-function-cast -Wundef \
-Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -ansi -D_XOPEN_SOURCE=500 \
-D_BSD_SOURCE -Wcast-align -Wconversion -fno-builtin -g -O2 -O0 -g3 -Wall \
-I.. -Ibcm_plant -Ibcm_panel -Ibcm_display -Ibcm_common -I../bcm_panel -I../bcm_display -I../bcm_common \
-fno-exceptions -fno-check-new -fexceptions -rdynamic \
-o MySampleProgram gestconfigbcmmessage.o clsmsgwritestatus.o testcr01.o util_panel.o updatefirmwaredisplay.o main.o \
/prd/b_BCM/bin/libJsonCpp.so  ./bcm_plant/libbcm_plant.a ./bcm_panel/libbcm_panel.a ./bcm_display/libbcm_display.a \
./bcm_common/libbcm_common.a /usr/local/lib/libxerces-c.so -lnsl -lpthread /usr/lib/libstdc++.so \
-L/usr3/BUILD/gcc/gcc-3.4.6/i686-pc-linux-gnu/libstdc++-v3/src \
-L/usr3/BUILD/gcc/gcc-3.4.6/i686-pc-linux-gnu/libstdc++-v3/src/.libs -L/usr3/BUILD/gcc/gcc-3.4.6/gcc \
-L/usr/local/lib -L/prd/b_BCM/src/b_BCM_common/modules -leasyzlib -lftplib -Wl,--rpath -Wl,/usr/local/lib -Wl,--rpath -Wl,/usr/local/lib
/usr/bin/ld: warning: libJsonCpp.so.2.12, needed by /prd/b_BCM/bin/libJsonCpp.so, not found (try using -rpath or -rpath-link)
make[1]: Leaving directory `/home/enzo/Autostrade/prd/b_BCM/src/MySampleProgram/MySampleProgram'

1 个答案:

答案 0 :(得分:0)

好吧,我找到了探测器。

由于一些奇怪的原因,新的lib包含对旧的lib的引用。

$ ldd  /prd/b_BCM/bin/libJsonCpp.so.2.13
        libpthread.so.0 => /lib/libpthread.so.0 (0x4004d000)

        libJsonCpp.so.2.12 => not found

        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

幸运的是,足以重建新的库并且错误的依赖性消失了

感谢Jonathan的支持。

Reagards,恩佐