web-dev-qa-db-fra.com

Quelle est la différence entre LDADD et LIBADD?

J'essaie de configurer un projet automake qui utilise un mélange de bibliothèques libtool et d'exectuables, et j'ai du mal à fouiller la documentation automake, en particulier. en ce qui concerne le fait de dire au compilateur de se lier.

Quelqu'un peut-il donc expliquer les différences entre LDADD et LIBADD?

Des choses comme:

  • quand est-on utilisé l'un sur l'autre,
  • lequel prend -lname_of_library valeurs de style par rapport aux noms de fichiers directs, etc.

Chaque fois que j'essaie de lire la documentation pertinente, il semble que cela suppose que je sais des choses que je ne connais pas.

27
Dave

Utilisez le LIBADD primaire pour les bibliothèques et LDADD pour les exécutables. Si vous construisiez une bibliothèque libtool libfoo.la, Qui dépendait d'une autre bibliothèque libbar.la, Vous utiliseriez:

libfoo_la_LIBADD = libbar.la

Si vous aviez d'autres bibliothèques non libtool, vous les ajouteriez également avec les options -L Et -l:

libfoo_la_LIBADD = libbar.la -L/opt/local/lib -lpng

En règle générale, vous utiliseriez le script de configuration pour trouver ces bibliothèques supplémentaires et utiliser AC_SUBST Pour les transmettre avec:

libfoo_la_LIBADD = libbar.la $(EXTRA_FOO_LIBS)

Pour un programme, utilisez simplement LDADD:

myprog_LDADD = libfoo.la # links libfoo, libbar, and libpng to myprog.

Parfois, les limites sont un peu vagues. $(EXTRA_FOO_LIBS) aurait pu être ajoutée à myprog_LDADD. Ajouter des dépendances à une bibliothèque libtool (.la) Et utiliser libtool pour faire toute la magie de l'éditeur de liens spécifique à la plate-forme, est généralement la meilleure approche. Il conserve toutes les métadonnées de l'éditeur de liens au même endroit.

34
Brett Hale

Comme mentionné dans l'un des livres, LDADD est des éléments ADDitional linker (LD) - c'est-à-dire des éléments qui sont ajoutés lors de la liaison. Ce serait, par exemple, lors de la production de programmes. LDADD peut spécifier:

  • fichiers libtool, par ex. lib/libfudge.la
  • bibliothèques par ex. -lm, Ou
  • chemins d'accès complets aux bibliothèques, par ex. /lib/libmagicalwonderland.a
  • liens de drapeaux et bibliothèques par exemple -L/opt/lib -lmagical

Ils sont par ordre de préférence - Utiliser les deux derniers est juste demander pour des problèmes car ils pointent vers des choses qui peuvent ou non être présentes.

LIBADD consiste à spécifier les LIBraries supplémentaires à utiliser. Ceci est utilisé lors de la construction d'une bibliothèque pour spécifier que des bibliothèques supplémentaires sont nécessaires pour construire ou utiliser la bibliothèque. Vous le verrez spécifié comme quelque chose comme libfred_la_LIBADD =. Il peut être utilisé pour spécifier les bibliothèques libtool ou les bibliothèques système et placera ces bibliothèques dans le libtool .la Résultant pour la bibliothèque, donc quand il s'agit de se lier à la bibliothèque, vous obtenez toutes les bibliothèques appropriées.

Vous ne devez spécifier que les bibliothèques à lier, donc, par exemple, ma bibliothèque libfred.la Dépend de certaines routines mathématiques, c'est-à-dire qu'elle dépend de libm. Lorsque je spécifie bibliothèques supplémentaires pour la bibliothèque, je déclare:

libfred_la_LIBADD = -lm

Cette dépendance est codée lorsque je crée la bibliothèque et est également transmise aux consommateurs de la bibliothèque.

La règle d'or est la suivante:

  • LIBADD pour les choses qui sont ajoutées à une bibliothèque
  • LDADD pour les choses qui sont ajoutées à un programme
13
Petesh