2010-12-27 6 views
6

私はこのようないくつかのシナリオを持っている:同じlibsの(同じ名前の)2つの異なるバージョンがアプリケーションに存在することはできますか?

製品 - > Platform対応> MYLIBS(バージョン-1)

製品 - > MYLIBS(バージョン2)

すなわち製品がMYLIBS(バージョン2を使用しています) 直接。製品はプラットフォーム(動的libでもあります)を使用し、プラットフォームは自分のlibs(バージョン-1)を使用します。

製品とプラットフォームで使用されるlibsの名前は同じです。バージョンのみが異なり、どちらのバージョンも互換性がありません。

プラットフォームには1つのバージョンにリンクでき、同じ名前を持つ同じライブラリの別のバージョンにリンクすることができるLinuxでは ".so" libsがありますか?

+0

なぜlibsの名前を変更しないのですか? –

答えて

6

シンボル名が競合するため、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 
+0

返事をありがとう。しかし、この警告「/ usr/bin/ld:warning:libmylibs.so.1が必要とするlibplatform.so.1がlibmylibs.so.2と衝突する可能性がある」という理由を理解できませんでした。 – Jay

+0

gccはすべてのシンボルがバージョン管理されているかどうかをチェックしないので、いくつかは競合する可能性があることを警告します。また、より高いレベルでは、両方のライブラリが同じリソースを制御したい場合など、2つのライブラリが動作中に競合する可能性があります。 – Jester

関連する問題