2010-12-27 5 views
6

Ich habe einige Szenario wie folgt aus:Können zwei verschiedene Versionen derselben Bibliotheken (mit demselben Namen) in einer Anwendung existieren?

Product-> Plattform-> MyLibs (Version-1)

Product-> MyLibs (Version-2)

dh Produkt verwendet MyLibs (Version-2) direkt. Produkt verwendet auch Plattform (die auch eine dynamische Bibliothek ist) und Plattform verwendet meine Bibliotheken (Version-1).

Die Namen der von Produkt und Plattform verwendeten Bibliotheken sind gleich. Nur Versionen sind unterschiedlich und beide Versionen sind nicht kompatibel.

Gibt es einen Weg mit ".so" -Bibliotheken in Linux, dass Plattform zu einer Version verknüpfen kann und Produkt zu einer anderen Version der gleichen Bibliotheken mit demselben Namen verknüpfen kann?

+0

warum ändern Sie nicht einfach die Namen der Bibliotheken? –

Antwort

6

Beachten Sie, dass selbst das Ändern der Namen der Bibliotheken standardmäßig nicht ausreicht, da die Symbolnamen einen Konflikt verursachen würden. Ihre Bibliotheken sollten Soname und versionierte Symbole verwenden, in diesem Fall können sie sogar gleich aufgerufen werden.

$ 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

Danke für die Antwort. Aber ich habe nicht verstanden, warum diese Warnung "/ usr/bin/ld: warning: libmylibs.so.1, benötigt von libplatform.so.1, kann Konflikt mit libmylibs.so.2" wird von gcc geworfen? – Jay

+0

Ich denke, das liegt daran, dass gcc nicht prüft, ob alle Symbole versioniert sind, also warnt es, dass einige Konflikte verursachen können. Außerdem können die beiden Bibliotheken auf einer höheren Ebene während des Betriebs Konflikte verursachen, z. B. wenn beide die gleiche Ressource steuern möchten. – Jester

Verwandte Themen