web-dev-qa-db-fra.com

Quelle est la différence entre -I et -L dans le makefile?

Quelle est l'utilisation des indicateurs -I et -L dans un makefile?

53
MainID

Celles-ci font généralement partie de la ligne de commande de l'éditeur de liens et sont soit fournies directement dans une action cible, soit plus généralement affectées à une variable make qui sera développée pour former une commande de lien. 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 à laquelle vous souhaitez créer un lien.

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

-L$(HOME)/libs -labc

Pour tirer parti de la règle implicite par défaut de liaison, ajoutez ces indicateurs à la variable LDFLAGS, comme dans

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

C'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 $@
        # or if you really want to call ld directly,
        # $(LD) $(LDFLAGS:-Wl,%=%) $^ $(LIBS) -o $@

Même si cela peut fonctionner autrement, le -l... les directives sont supposées aller après les objets qui référencent ces symboles. Quelques optimisations (-Wl,--as-needed est le plus évident) échouera si la liaison est effectuée dans le mauvais ordre.

91
Nathan Fellman

Pour vraiment créer un 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 comme -I et -L ne sont pas compris par make lui-même. Au lieu de cela, make tente de créer une ligne de commande qui exécutera un outil pour transformer un fichier prérequis en fichier cible.

Il s'agit souvent d'un fichier source C ou C++ en cours de compilation 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.

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

L'essentiel est que le "langage" d'un makefile est une combinaison de la syntaxe du makefile lui-même, votre Shell comme connu pour faire (généralement /bin/sh ou quelque chose de similaire), les commandes Shell courantes (telles que rm, cp, install, etc.) et les commandes spécifiques à votre compilateur et éditeur de liens (par exemple, en tapant gcc -v --help à votre invite Shell vous donnera une liste presque complète (et extrêmement longue) des options comprises par gcc comme un point de départ).

26
RBerteig

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

2
sateesh