Question

Je construis .donc bibliothèque et je me demandais - quelle est la différence b / w -h et option -o cc complier (en utilisant le Sun Studio C ++)?

ne sont pas, ils se réfèrent à la même chose - le nom du fichier de sortie

Était-ce utile?

La solution

-o est le nom du fichier qui sera écrit sur le disque par le compilateur

-h est le nom qui sera enregistré dans les exécutables ELF qui pointent contre ce fichier.

Une utilisation courante est de fournir les numéros de version mineure bibliothèque. Par exemple, si vous créez la bibliothèque partagée libfoo, vous pourriez faire:

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

Alors si vous compilez votre application Bonjour tout le monde et le lien avec contre

cc -o hello -lfoo

le binaire elfe pour bonjour enregistre une entrée de NEEDED pour libfoo.so.1 (que vous pouvez voir en exécutant elfdump -d hello).

Ensuite, lorsque vous avez besoin d'ajouter de nouvelles fonctions plus tard, vous pouvez changer la valeur -o à libfoo.so.1.1 mais laissez le -h à libfoo.so.1 - tous les programmes que vous avez déjà CONSTRUIT avec 1,0 toujours essayer de charger libfoo.so.1 lors de l'exécution, afin de continuer à travailler sans être rebâti, mais vous verrez par ls que c'est 1.1.

Ceci est également parfois utilisé lors de la construction des bibliothèques dans le même répertoire, ils sont utilisé lors de l'exécution, si vous ne disposez pas d'un répertoire d'installation séparée ou installer via un système d'emballage. Pour éviter de s'écraser les programmes qui sont en cours d'exécution lorsque vous remplacer le binaire de la bibliothèque, et d'éviter les programmes ne pas être en mesure de commencer quand vous êtes au milieu de la construction, certains Makefile fera:

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

(Makefile construit par l'ancien générateur de Makefile Imake de X couramment le faire.)

Autres conseils

Ils font référence à des noms différents. Plus précisément, l'option est -o du fichier réelle nom - celui sur le système de fichiers. L'option -h définit la DT_SONAME interne dans le fichier objet final. Tel est le nom par lequel l'objet partagé est référencé en interne par d'autres modules. Je crois que c'est le nom que vous voyez également lorsque vous exécutez ldd sur des objets qui pointent vers elle.

L'option -o sera le nom du fichier de sortie alors que l'option -h définir un nom intrinsèque dans la bibliothèque. Ce nom intrinsèque a préséance sur le nom du fichier lorsqu'il est utilisé par le chargeur dynamique et permet d'utiliser des règles prédéfinies pour jeter un regard la bibliothèque droite.

Vous pouvez voir quel nom intrinsèque a été enregistré dans une bibliothèque donnée avec cette commande:

elfdump -d xxx.so | grep SONAME

Jetez un coup d'oeil ici pour plus de détails:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top