Frage

Ich baue .so Bibliothek und wunderte mich - was ist der Unterschied b / w h und -o cc complier Option (die Sun Studio C ++ verwendet wird)?

Sind sie nicht auf dasselbe beziehen - den Namen der Ausgabedatei

War es hilfreich?

Lösung

-o ist der Name der Datei, die vom Compiler

auf der Platte geschrieben werden

-h ist der Name, der in ELF-Binärdateien aufgezeichnet werden, die gegen diese Datei.

Eine häufige Verwendung ist Bibliothek kleinere Versionsnummern zur Verfügung zu stellen. Zum Beispiel, wenn Sie die gemeinsame Bibliothek libfoo erstellen, Sie können tun:

cc -o libfoo.so.1.0 -h libfoo.so.1 *.o
ln -s libfoo.so.1.0 libfoo.so.1
ln -s libfoo.so libfoo.so.1

Dann, wenn Sie Ihre Hallo Welt app und Link gegen sie mit

kompilieren
cc -o hello -lfoo

die Elf binär für hallo einen NEEDED Eintrag für libfoo.so.1 aufnehmen (die Sie siehe durch Ausführen elfdump -d hello).

Wenn Sie dann später neue Funktionen hinzufügen müssen, können Sie den -o Wert ändern libfoo.so.1.1 aber die h bei libfoo.so.1 verlassen - alle Programme, die Sie bereits gebaut mit 1,0 immer noch versuchen, zur Laufzeit laden libfoo.so.1, so weiter, ohne arbeiten zu wieder aufgebaut, aber Sie werden über ls sehen, dass es 1.1 ist.

Dies wird auch manchmal verwendet, wenn Bibliotheken im selben Verzeichnis bauen sie sind zur Laufzeit verwendet, wenn Sie nicht über ein separates Installationsverzeichnis oder installieren über ein Verpackungssystem. Um zu vermeiden, Programme abstürzt, dass, wenn Sie ausführen, überschreiben der Bibliothek binär, und Programme zu vermeiden, nicht gestartet werden kann, wenn Sie sind in der Mitte des Gebäudes, werden einige Makefiles tun:

cc -o libfoo.so.1.new -h libfoo.so.1 *.o
rm libfoo.so.1 ; mv libfoo.so.1.new libfoo.so.1

(Makefiles durch den alten Generator Imake Make-Datei von X gebaut häufig tun.)

Andere Tipps

Sie beziehen sich auf unterschiedliche Namen. Insbesondere ist die -o Option der die Datei ist name - die auf dem Dateisystem. Die -h Option stellt den intern DT_SONAME in der letzten Objektdatei. Dies ist der Name, mit dem das gemeinsame Objekt von anderen Modulen intern verwiesen wird. Ich glaube, es ist der Name, den Sie auch sehen, wenn Sie ldd auf Objekte ausführen, die auf sie verwiesen wird.

Die Option -o wird die Ausgabedatei benennen, während die Option -h eine Eigenname in der Bibliothek eingestellt werden. Dieser Eigenname Vorrang vor dem Dateinamen hat, wenn durch den dynamischen Lader verwendet und ermöglicht es, vordefinierte Regeln zu verwenden, um die richtige Bibliothek spähen.

Sie können sehen, was Eigennamen in einer bestimmten Bibliothek mit diesem Befehl aufgezeichnet wurde:

elfdump -d xxx.so | grep SONAME

Haben Sie einen Blick hier für weitere Details:

http://docs.oracle.com /cd/E23824_01/html/819-0690/chapter4-97194.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top