2010-10-15 18 views
0

J'ai 4 fichiers .c hello.c, here.c, bye.c et main.c. Un fichier d'en-tête mylib.hDépendance récursive trouvée dans un fichier Make pour créer une bibliothèque statique

Le contenu sont les suivants

hello.c

#include<stdio.h> 

void hello() 
{ 
    printf("Hello!\n"); 
} 

here.c

#include<stdio.h> 

void here() 
{ 
    printf("I am here \n"); 
} 

bye.c

#include<stdio.h> 

void bye() 
{ 
    printf("Bye,Bye"); 
} 

main.c

#include<stdio.h> 
#include "mylib.h" 

int main() 
{ 

    hello(); 
    here(); 
    bye(); 
    return 1; 
} 

malib.h

#ifndef _mylib_ 
#define _mylib_ 

void hello(); 
void here(); 
void bye(); 

#endif 

Le makefile pour la création d'une lib statique est: Makefile

all: myapp 

#Macros 

#Which Compiler 
CC = g++ 

#Where to install 
INSTDIR = /usr/local/bin 

#Where are include files kept 
INCLUDE = . 

#Options for developement 
CFLAGS = -g -Wall -ansi 

#Options for release 
#CFLAGS = -O -Wall -ansi 

#Local Libraries 
MYLIB = mylib.a 

myapp: main.o $(MYLIB) 
    $(CC) -o myapp main.o $(MYLIB) 

$(MYLIB):  $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o) 
main.o:   main.c mylib.h 
hello.o:  hello.c 
here.o:   here.c 
bye.o:   bye.c 

clean: 
    -rm main.o hello.o here.o bye.o $(MYLIB) 

install:  myapp 
    @if [ -d $(INSTDIR) ]; \ 
    then \ 
      cp myapp $(INSTDIR);\ 
      chmod a+x $(INSTDIR)/myapp;\ 
      chmod og-w $(INSTDIR)/myapp;\ 
      echo "Installed in $(INSTDIR)";\ 
    else \ 
      echo "Sorry, $(INSTDIR) does not exist";\ 
    fi 

Problème: Quand j'exécutez la commande

make -f Makefile all 

Je reçois l'erreur dependecy suivante:

make: Circular mylib.a <- mylib.a dependency dropped. 
ar rv (hello.o) hello.o 
/bin/sh: -c: line 0: syntax error near unexpected token `(' 
/bin/sh: -c: line 0: `ar rv (hello.o) hello.o' 
make: *** [(hello.o)] Error 2 

Questions: How do I resolve this? Which command is causing the cyclic dependency?

+0

Soit dit en passant, en utilisant '' g ++ est un compilateur pour un programme 'C' est un surpuissant. Il liera votre binaire/bibliothèque avec l'exécution C++ standard ('libstdC++'), dont vous n'avez pas besoin dans 'C'. Remplacer 'CC = g ++' par 'CC = gcc' devrait corriger cela. –

+0

Changé pour gcc - le problème persiste –

Répondre

3
#Local Libraries 
MYLIB = mylib.a 

myapp: main.o $(MYLIB) 
    $(CC) -o myapp main.o $(MYLIB) 

$(MYLIB):  $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o) 

Il semble que la dernière règle est

mylib.a: mylib.a (hello.o) mylib.a (here.o) mylib.a (bye.o) 

Ce qui est une dépendance circulaire.

La ligne devrait être

mylib.a: hello.o here.o bye.o 

Sans les parenthèses.

+0

@nategoose: Je ne pense pas que ce soit un problème. C'est un moyen de faire savoir à la bibliothèque quels fichiers objets elle doit contenir. –

+0

mylib.a ne peut jamais être plus âgé que lui-même. Il ne devrait être qu'à gauche du ':' Plus voir edit. – nategoose

+0

@natgoose: J'ai fait le changement suggéré et je reçois l'erreur suivante gcc -o myapp main.o mylib.a gcc: mylib.a: Aucun fichier ou répertoire make: *** [myapp] Erreur 1 –

2

Pas positif, mais:

$(MYLIB):  $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o) 

Si je me souviens de ma syntaxe Makefile, cette ligne dit $(MYLIB) depends on $(MYLIB)... Lequel des evalue de cours vers: mylib.a: mylib.a...

+0

Et juste pour clarifier, je pense que ce que vous voulez est: '$ (MYLIB): main.o bonjour.o ici.au revoir.o' – Bryan

+0

@Brian: Je ne pense pas que ce soit un problème. C'est un moyen de faire savoir à la bibliothèque quels fichiers objets elle doit contenir. –

+0

@Eternal Learner: La syntaxe du makefile est 'target: dependencies' ... Si votre but est de compiler hello.o, here.o, et bye.o dans un seul fichier .a, ce n'est pas la bonne façon de faire il. Tout ce que fait cette ligne est de dire de quels fichiers $ (MYLIB) dépend, et maintenant, $ (MYLIB) dépend de $ (MYLIB) qui est récursif. – Bryan

1

Supprimez le $(MYLIB) étranger dans la liste des dépendances. C'est:

$(MYLIB):  $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o) 

devrait être:

$(MYLIB):  hello.o here.o bye.o 
+0

Je ne pense pas que ce soit un problème. C'est un moyen de faire savoir à la bibliothèque quels fichiers objets elle doit contenir. –