2009-02-06 8 views

Répondre

75

Elles font généralement partie de la ligne de commande de l'éditeur de liens et sont fournies directement dans une action cible, ou plus généralement affectées à une variable make qui sera développée pour former une commande de liaison. Dans ce cas:

-L est le chemin d'accès aux répertoires contenant les bibliothèques. Un chemin de recherche pour les bibliothèques.

-l est le nom de la bibliothèque que vous souhaitez lier.

Par exemple, si vous souhaitez créer un lien vers la bibliothèque ~/libs/libabc.a vous souhaitez ajouter:

-L$(HOME)/libs -labc 

Pour bénéficier de la règle par défaut implicite pour relier, ajouter ces drapeaux à la variable LDFLAGS, comme dans

LDFLAGS+=-L$(HOME)/libs -labc 

Il est une bonne habitude de séparer LDFLAGS et LIBS, par exemple

# LDFLAGS contains flags passed to the compiler for use during linking 
LDFLAGS = -Wl,--hash-style=both 
# LIBS contains libraries to link with 
LIBS = -L$(HOME)/libs -labc 
program: a.o b.o c.o 
     $(CC) $(LDFLAGS) $^ $(LIBS) -o [email protected] 
     # or if you really want to call ld directly, 
     # $(LD) $(LDFLAGS:-Wl,%=%) $^ $(LIBS) -o [email protected] 

Même si elle peut fonctionner autrement, les -l... directives sont censées aller après les objets qui font référence à ces symboles. Certaines optimisations (-Wl,--as-needed est la plus évidente) échoueront si la liaison est effectuée dans le mauvais ordre.

+0

https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html: LDFLAGS Drapeaux supplémentaires à donner aux compilateurs lorsqu'ils sont censés invoquer l'éditeur de -L. Les bibliothèques (-lfoo) doivent être ajoutées à la variable LDLIBS à la place. > LDLIBS Drapeaux de bibliothèques ou noms donnés aux compilateurs lorsqu'ils sont supposés appeler l'éditeur de liens, 'ld'. LOADLIBES est une alternative obsolète (mais toujours supportée) à LDLIBS. Les indicateurs de liens de non-bibliothèque, tels que -L, doivent figurer dans la variable LDFLAGS. –

0

Une chose à noter est que ce sont les options passées au compilateur/éditeur de liens. Vous devriez donc regarder les pages de manuel du compilateur/documentation pour connaître leur rôle.

17

Pour vraiment créer un fichier makefile, vous devez également avoir une bonne compréhension des lignes de commande pour tous les composants de la chaîne d'outils de votre projet. Des options telles que -I et -L ne sont pas comprises par le fabricant. Au contraire, make tente de créer une ligne de commande qui exécutera un outil pour transformer un fichier prérequis en un fichier cible.

Souvent, il s'agit d'un fichier source C ou C++ compilé dans un fichier objet, et éventuellement lié pour obtenir un fichier exécutable.

Dans ce cas, vous devez voir le manuel de votre compilateur, et en particulier les bits liés aux options de ligne de commande qu'il comprend.

Tout cela dit en termes génériques, ces options spécifiques sont assez standard parmi les compilateurs et les linkers. -I ajoute un répertoire à la liste des lieux recherchés par le compilateur pour un fichier nommé sur une ligne #include, et -L ajoute un répertoire à la liste des lieux recherchés par l'éditeur de liens pour une bibliothèque nommée avec l'option -l.

L'essentiel est que la « langue » d'un makefile est une combinaison de la syntaxe du makefile lui-même, votre coquille comme on le sait faire (habituellement /bin/sh ou quelque chose de similaire), des commandes shell communes (telles que rm, cp , install, etc.), et les commandes spécifiques à votre compilateur et éditeur de liens (par ex.taper gcc -v --help à l'invite de votre shell vous donnera une liste presque complète (et extrêmement longue) des options comprises par gcc comme un point de départ).

+0

Je ne sais toujours pas quelle est la manière la plus efficace de représenter le drapeau -I? -L peut être traduit en LDFLAGS. – Edmon

Questions connexes