Notes de démarrage Wei Dongshan Embedded - Principes de base du développement d'applications (2)

Troisièmement, l'utilisation de Makefile

1. Pourquoi avez-vous besoin de Makefile?
Après avoir écrit le programme, si un seul fichier source (tel que le fichier .h) est modifié, il est alors impossible de recompiler tous les fichiers source via une série de commandes, et parfois il y a plus de fichiers source qui ont été modifiés Enfin, oubliez de compiler certains fichiers source. L'outil de création peut résoudre les problèmes ci-dessus, il recompilera tous les fichiers source affectés par les modifications si nécessaire. Le Makefile indique à make comment compiler et créer un lien dans un programme. L'avantage de Makefile est la "compilation automatique", une fois qu'il est écrit, une seule commande make est nécessaire, et l'ensemble du projet est compilé complètement automatiquement, ce qui améliore considérablement l'efficacité du développement logiciel.

Les fichiers Makefile sont généralement placés dans le même répertoire que les autres fichiers source du projet.

2. Règles simples de Makefile:

Un simple fichier Makefile contient une série de "règles", le style est le suivant:

Cible : dépendant (conditions préalables) // programme cible ou fichier dépendant de fichier dépendant

<tab> Commande (commande) // Si le "fichier dépendant" est plus récent que le "fichier cible" (c'est-à-dire modifié), alors exécutez la "commande" pour régénérer le "fichier cible"

Deux commandes sont des conditions exécutées : les fichiers dépendants que le nouveau fichier cible ou le document cible n'ont pas non plus généré .

Les commandes sont des actions exécutées par Make. Une règle peut contenir plusieurs commandes et chaque commande occupe une ligne. Remarque: Chaque ligne de commande doit être précédée d'un caractère de tabulation, c'est-à-dire que le premier caractère de la ligne de commande est Tab. C'est là que les accidents sont faciles à faire des erreurs.

3. Présentez d'abord les 2 fonctions de Makefile

A.   $ (foreach var, liste, texte)

En termes simples, c'est pour chaque variable de la liste, changez-la en texte.

Pour chaque élément de la liste, retirez-le et affectez-le à var, puis remplacez var par la forme décrite par texte.

Exemple:

objs: = au bo

dep_files: = $ (foreach f, $ (objs),. $ (f) .d) // final dep_files: = .aod .bod


B.   $ (modèle générique)

Si les fichiers répertoriés dans le modèle existent, répertoriez tous les fichiers existants.

Exemple:

src_files: = $ (wildcard * .c) // Enfin, tous les fichiers .c du répertoire courant sont listés dans src_files


4. Lors de l'utilisation de la commande make, il recherchera d'abord un fichier nommé Makefile dans le répertoire courant, puis exécutera les commandes du Makefile et affichera les commandes exécutées sur le terminal, telles que:

book @ 100ask : ~ / 04_test_Makefile $ make
gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -o test main.o sub.o

Si le programme / fichier cible n'a pas besoin d'être modifié, il vous demandera que le programme cible est à jour:

book @ 100ask : ~ / 04_test_Makefile $ make
make : 'test' est à jour.


5. Lors de la création d'un fichier Makefile, sélectionnez le format de fichier Makefile


6. L'exécution des commandes est séquentielle: si les commandes du fichier Makefile sont les suivantes:

test: main.o sub.o
    gcc -o test main.o sub.o

main.o: main.c
     gcc -c -o main.o main.c

sous.o: sous.c
      gcc -c -o sous.o sous.c

Le premier test du fichier cible dépend de main.o et sub.o, car main.o n'existe pas, passez à la deuxième commande, alors exécutez d'abord gcc -c -o main.o main.c; puis revenez à la première Ligne, on constate que sub.o n'existe pas, alors passez au troisième paragraphe et exécutez gcc -c -o sub.o sub.c; de retour à la première ligne, les deux fichiers dépendants sont présents, et le fichier cible est généré si les conditions sont remplies test


7. make clean: exécutez uniquement les commandes pertinentes du fichier cible clean dans le Makefile.


8. $ @ signifie tous les fichiers cibles, $ ^ signifie tous les fichiers dépendants et $ <signifie le premier fichier dépendant

% .o :%. c
       gcc -c -o $ @ $ ^


9. Lorsqu'un fichier cible a deux fichiers dépendants, dont l'un a une commande et l'autre n'a pas de commande, les deux fichiers dépendants seront fusionnés. La modification du fichier dépendant sans commande déclenchera également une autre commande de fichier dépendant.
Toutefois, une ligne vide est requise sous le fichier dépendant sans commande et la ligne vide ne peut pas avoir la touche Tabulation.


10. L'effet que vous souhaitez obtenir: lorsque vous modifiez le fichier source ou le fichier d'en-tête, utilisez simplement la commande make pour recompiler les fichiers impliqués, et vous pouvez régénérer l'application: veuillez consulter la section 4-3-1 (ne pas comprendre)
①Pourquoi faire des travaux propres Utilisation répétée? Le nettoyage n'est-il pas un programme comme le test? Si clean existe, pourquoi peut-il être généré à plusieurs reprises?
②Pourquoi changer le format de fichier de .main.d?
③ À quoi sert objs: = main.o sub.o?
④Pourquoi utiliser la forme $ {objs} lors de l'utilisation d'objs?

 

11. Comment utiliser le Makefile général:
(1) Mettez le Makefile de niveau supérieur, Makefile.build dans le répertoire de niveau supérieur du programme et
  créez un Makefile vide dans les sous-répertoires respectifs

(2)
  Étapes pour déterminer les fichiers source à compiler :
(1) Modifiez et ajoutez obj-y  de Makefile dans le répertoire de niveau supérieur si nécessaire
(2) Ajoutez obj-y  au Makefile vide dans chaque sous-répertoire

   La description de obj-y:
   obj-y + = xxx.o
   obj-y + = yyy /           
   ① Cela signifie compiler xxx.c dans le répertoire courant (compiler le fichier .c pour obtenir le fichier .o) et le sous-répertoire yyy (Le Makefile dans le répertoire yyy spécifiera les fichiers et sous-répertoires qui doivent être compilés dans le répertoire)
   ②La barre oblique / qui signifie yyy est un sous - répertoire / ne peut pas être omis

(3)
  Étapes pour déterminer les options de compilation et les options de liaison :
(1) Modifiez les CFLAGS du répertoire supérieur Makefile , qui est une option de compilation qui doit être utilisée lors de la compilation de tous les fichiers .c;
           il y a un tel paragraphe dans le Makefile supérieur:

     CFLAGS + = -I $ (shell pwd) / inclure

          Étant donné que tous les fichiers d'en-tête d'un fichier projet sont placés dans le répertoire d'inclusion, ce paragraphe signifie: lors de la compilation de tous les fichiers .c, il trouvera le répertoire d'inclusion (le fichier d'en-tête dans le fichier) sous le fichier.

(2) Modifiez le LDFLAGS de l' annuaire de premier niveau Makefile , Il s'agit de l'option de lien lors de la liaison de la dernière application;
           LDFLAGS peut spécifier l'emplacement de la bibliothèque et le nom de la bibliothèque lors de la liaison:

     LDFLAGS : = -L dir -labc

           -L est l'emplacement de la bibliothèque spécifiée est le répertoire dir sous l'emplacement actuel, -l (L minuscule) spécifie le nom de la bibliothèque sous la forme abc

(3) Définissez d'autres options de compilation (facultatif) et
           modifiez les Makefiles dans leurs sous-répertoires respectifs:
           "EXTRA_CFLAGS", qui définit des options de compilation supplémentaires pour tous les fichiers du répertoire en cours (à l'exception des sous-répertoires sous celui-ci). Vous pouvez le laisser seul
           . CFLAGS_xxx. o ", il définit ses propres options de compilation pour xxx.c dans le répertoire courant, ne peut-il pas être défini
   
(4) Quel compilateur est utilisé?
  Modifiez le CROSS_COMPILE dans la première ligne du répertoire de niveau supérieur Makefile pour spécifier le préfixe de la chaîne d'outils (comme arm-linux-).
  S'il est compilé sous gcc, aucune affectation n'est effectuée.
   
(5) Déterminez le nom de l'application:
  modifiez la CIBLE du répertoire de premier niveau Makefile , Ceci est utilisé pour spécifier le nom du programme compilé, tel que:

CIBLE: = test

(6) Exécutez "make" pour compiler, exécutez "make clean" pour nettoyer, et exécutez "make distclean" pour nettoyer complètement

(7) Lorsque la compilation est réussie, le message "xxx a été construit!"

(8) L'emplacement du code source du Makefile général: [Partie 4] Connaissance de base du développement d'applications Linux embarquées / source / 05_general_Makefile

 

12. Analyse du Makefile général: Section 4-3-3, sautée
Analyse de la signification des commandes dans le Makefile et des idées de conception du Makefile,
veuillez vous référer aux Section 3.0.3 et Section 3.0.3 du Chapitre 4 "Basique Connaissance du développement d'applications Linux embarquées "Section 3.1

Je suppose que tu aimes

Origine blog.csdn.net/San_a_fish_of_dream/article/details/113256556
conseillé
Classement