2017-10-18 34 views
1

J'ai 3 fichiers: node.h, node.c et main.c Si le Makefile estgénéré automatiquement commande makefile

CFLAGS += -std=c99 -g -Wall 
run: node 
    ./node 

node: node.o main.o 

Puis, quand je lance make, ces commandes sont exécutées

cc -std=c99 -g -Wall -c -o node.o node.c 
cc -std=c99 -g -Wall -c -o main.o main.c 
cc node.o main.o -o node 
./node 

Je suppose que les deux premières lignes sont générés en raison

  • d'abord, make essayez d'exécuter node mais il ne peut pas trouver node.
  • Ainsi, make détient run et va à la cible suivante, qui est node à la ligne 4.
  • Ensuite, make voit les dépendances node.o et main.o. A cette époque, il sait qu'il doit créer des fichiers d'objets node.o et main.o

Cependant, je ne peux pas comprendre pourquoi la troisième commande est générée

cc node.o main.o -o node 

Pour tenter d'explorer ce mystère, je constate que si node à la ligne 2 est changé en node1, une erreur se produit

CFLAGS += -std=c99 -g -Wall 
run: node1 
    ./node1 

node1: node.o main.o 

Répondre

1

de https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html#Catalogue-of-Rules:

Liaison d'un seul fichier d'objet

n est faite automatiquement à partir de n.o en exécutant l'agent de liaison (appelé habituellement ld) par le compilateur C. La recette précise utilisée est '$ (CC) $ (LDFLAGS) n.o $ (LOADLIBES) $ (LDLIBS)'.

Cette règle fait la bonne chose pour un programme simple avec un seul fichier source. Il fera également la bonne chose s'il y a plusieurs fichiers objets (provenant vraisemblablement de divers autres fichiers source), dont l'un a un nom correspondant à celui du fichier exécutable.

Lorsque vous avez changé de nœud à node1, il n'y a plus un node1.c (donc pas node1.o implicite, et donc la règle implicite ne s'applique pas).

+0

Nice. Mon instinct me dit qu'il doit y avoir des règles implicites, mais je ne peux pas trouver les documents. Je vous remercie. – cuongptnk