-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 consiste à fournir des numéros de version de bibliothèque mineurs. Par exemple, si vous créez la libfoo de bibliothèque partagée, 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
Ensuite, si vous compilez votre application Bonjour tout le monde et un lien contre avec
cc -o hello -lfoo
le binaire elfe pour bonjour va enregistrer une entrée NEEDED
pour libfoo.so.1
(que vous pouvez voir en exécutant elfdump -d hello
).
Puis, quand vous avez besoin d'ajouter de nouvelles fonctions plus tard, vous pouvez changer la valeur -o
à mais laisser le -h à libfoo.so.1
- tous les programmes que vous avez déjà construits avec 1.0 toujours essayer de charger libfoo.so.1
lors de l'exécution, afin de continuer pour travailler sans être reconstruit, mais vous verrez via ls que c'est 1.1. Ceci est également parfois utilisé lors de la construction de bibliothèques dans le même répertoire utilisé lors de l'exécution, si vous n'avez pas de répertoire d'installation séparé ou si vous installez via un système d'empaquetage. Pour éviter de s'écraser les programmes en cours d'exécution lorsque vous écrasez le binaire 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 d'Imake de X le font généralement.)
Bonne question - les docs disent, « en général, le nom après -h doit être exactement la même que celle d'après -o ». Il pourrait être plus intéressant s'ils ont dit quand vous pourriez vouloir qu'ils soient différents ou ce qui se passe si vous spécifiez l'un sans l'autre. Je pense qu'un peu d'expérimentation est en ordre. –