Unterschied zwischen -h und -o Optionen in cc (C ++)
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
Lösung
-o
ist der Name der Datei, die vom Compiler
-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
kompilierencc -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