2010-10-01 4 views
24

Folgende Frage How do applications resolve to different versions of shared libraries at run time?, fragte ich mich, wie in der Link-Befehlszeile anzugeben, welche Version der Bibliothek zu verwenden?Wie wird die Bibliotheksversion angegeben, die zur Verbindungszeit verwendet werden soll?

Sagen wir, ich

libmy.so.1.0 
libmy.so.1 -> libmy.so.1.0 
libmy.so.2.0 
libmy.so.2 -> libmy.so.2.0 
libmy.so  -> libmy.so.2 

Die übliche Art und Weise haben, die Bibliothek geben mit der ausführbaren Datei zu verknüpfen zeigt nicht die Version zu verwenden. Außerdem ist es sehr wahrscheinlich, dass man mit der neuesten Version verlinken möchte. Daher funktioniert die übliche Linie in den meisten Fällen gut.

gcc app.o -lmy -o app 

Was ist die Befehlszeile app zu verknüpfen, die Version 1 der Bibliothek verwendet werden soll?

Antwort

31

Der Linker ist in der Lage Dateinamen zu

gcc app.o -l:libmy.so.1 -o app 

Von man ld zu akzeptieren:

-l namespec
--library = namespec
Fügen Sie das Archiv oder Objektdatei wird von namespec auf die Liste der zu verknüpfenden Dateien festgelegt. Diese Option kann beliebig oft verwendet werden. Wenn namespec das folgende Format hat: filename, sucht ld den Bibliothekspfad nach einer Datei mit dem Namen filename, ansonsten durchsucht es den Pfad nach einer Datei namens libnamespec.a.

Ich bemerkte, dass ältere Versionen es nicht unterstützen, so überprüfen Sie auf Ihrem System man ld-l oder --library Option.

Sie können auch auf die Datei verknüpfen zu erwähnen seinen vollständigen Namen

gcc app.o /mylibpath/libmy.so.1 -o app 
+10

Vorsicht: was Linker verwendet, und was dynamicaly auf Laufzeit aufgelöst wird (was 'ldd app' zeigen) ist vielleicht nicht die gleiche Sache sein . –

Verwandte Themen