différence entre -h et -o options cc (C ++)
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
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