2017-10-02 3 views
0

J'ai reçu cet exemple de fichier makefile de mon professeur et j'essaie de l'exécuter sur Ubuntu mais les commandes que je tape ne l'exécuteront pas. Tous les fichiers dans le makefile existent déjà et quand je tape make, il crée les fichiers mais le programme actuel ne fonctionne pas. J'ai essayé de taper ./a.out mais cela ne fonctionne pas non plus. S'il vous plaît aidez-moi avec quelle commande à taper pour le programme à exécuter.Exécution d'un programme à partir d'un fichier makefile

# Makefile for Library Management System 
CXXFLAGS += --std=c++11 

all: div main 
rebuild: div clean main 

debug: CXXFLAGS += -g 
debug: rebuild 

main: main.o controller.o view.o library.o publication.o 
    $(CXX) $(CXXFLAGS) -o lms main.o controller.o view.o library.o publication.o 
main.o: main.cpp *.h 
    $(CXX) $(CXXFLAGS) -c main.cpp 
controller.o: controller.cpp *.h 
    $(CXX) $(CXXFLAGS) -c controller.cpp 
test_view: test_view.o controller.o view.o library.o publication.o 
    $(CXX) $(CXXFLAGS) -o test_view test_view.o controller.o view.o library.o publication.o 
test_view.o: test_view.cpp view.h publication.h library.h 
    $(CXX) $(CXXFLAGS) -c test_view.cpp 
test_library: test_library.o library.o publication.o 
    $(CXX) $(CXXFLAGS) -o test_library test_library.cpp library.o publication.o 
test_library.o: test_library.cpp *.h 
    $(CXX) $(CXXFLAGS) -c test_library.cpp 
library.o: library.cpp *.h 
    $(CXX) $(CXXFLAGS) -c library.cpp 
test_publication: test_publication.o publication.o 
    $(CXX) $(CXXFLAGS) -o test_publication test_publication.o publication.o 
test_publication.o: test_publication.cpp *.h 
    $(CXX) $(CXXFLAGS) -c test_publication.cpp 
publication.o: publication.cpp *.h 
    $(CXX) $(CXXFLAGS) -c publication.cpp 

clean: 
    -rm -f *.o lms test_age test_genre test_media test_publication test_library test_view test_view_actual.txt 

div: 
    @echo 
    @echo 'X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-' 
    @echo '-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X' 
    @echo 'X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-' 
    @echo '-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X' 
    @echo 
+3

Juste une supposition sauvage: la commande après le nom d'une règle devrait être indentée par un onglet, mais dans votre extrait, je vois 4 espaces. – 0605002

+1

Les caractères TAB sont significatifs dans 'Makefile'-s –

Répondre

3

Existe-t-il un fichier appelé 'lms'? Essayez d'exécuter: ./lms

Les éléments du fichier makefile après '-o' spécifient les noms de fichiers en sortie. Ce sont les programmes que vous pouvez exécuter.

+1

lms est le fichier de sortie spécifié par la cible 'principale'. (-o lms) – vincent

+1

Ugh. C'est un mauvais makefile et je n'ai pas remarqué, d'où mon commentaire précédent. Le nom du programme * devrait * être le même que celui qui précède le deux-points sur les lignes non indentées, mais ce n'est pas le cas dans ce cas. –

+0

Ah. Vous pouvez le changer en nom de cible en utilisant la variable spéciale '$ @'. – vincent

1

Le travail de make est de construire le programme, pas l'exécuter, donc le fichier make fonctionne probablement très bien.

Vous pouvez voir la ligne:

all: div main 

que le makefile va essayer de construire div et main par défaut.

Il y a une règle pour div qui imprime juste des choses à la console:

div: 
    @echo 
    @echo 'X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-' 
    @echo '-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X' 
    @echo 'X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-' 
    @echo '-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X' 
    @echo 

comme indiqué dans les commentaires de l'autre réponse, la règle de main a le drapeau de gcc -o lms si l'exécutable de sortie réelle le nom sera lms.

Vous devriez vraiment dire à votre professeur que c'est une mauvaise forme, car un fichier makefile est supposé créer un fichier avec le même nom que sa règle. (c'est-à-dire make main devrait construire un fichier appelé main) N'hésitez pas à le pointer ici s'il n'est pas d'accord.