2010-10-22 29 views
0

Hé les gars, j'ai écrit un makefile qui fonctionne parfaitement sur mon iMac de 27 "à la maison avec Snow Leopard, mais quand je l'ai téléchargé sur mon ordinateur, un Snow Leopard de 24" les suivantes:ne fonctionne pas comme prévu

gcc -std=c99 -Wall -pedantic -Werror -c print.c 
gcc -std=c99 -Wall -pedantic -Werror -c process.c 
gcc -std=c99 -Wall -pedantic -Werror -c sync.c 
gcc -std=c99 -Wall -pedantic -Werror -c option_a.c 
gcc -std=c99 -Wall -pedantic -Werror -c option_m.c 
gcc -std=c99 -Wall -pedantic -Werror -c option_n.c 
gcc -std=c99 -Wall -pedantic -Werror -c option_p.c 
gcc -std=c99 -Wall -pedantic -Werror -c option_r.c 
gcc -std=c99 -Wall -pedantic -Werror -c option_u.c 
gcc -std=c99 -Wall -pedantic -Werror -c option_v.c 
ar -rc libopt.a option_a.o option_m.o option_n.o option_p.o option_r.o option_u.o option_v.o 
gcc -std=c99 -Wall -pedantic -Werror -o mysync mysync.c print.o process.o sync.o libproj2.a libopt.a 
libproj2.a: could not read symbols: Archive has no index; run ranlib to add one 
collect2: ld returned 1 exit status 
make: *** [mysync] Error 1 

Voici mon makefile:

PROJECT = mysync 
COMPILE = gcc -std=c99 -Wall -pedantic -Werror 
OPT_OBJ = option_a.o option_m.o option_n.o option_p.o option_r.o option_u.o option_v.o 
MAIN = print.o process.o sync.o 

$(PROJECT): $(PROJECT).c $(MAIN) libproj2.a libopt.a 
    $(COMPILE) -o mysync $(PROJECT).c $(MAIN) libproj2.a libopt.a 

libopt.a: $(OPT_OBJ) 
    ar -rc libopt.a $(OPT_OBJ) 

%.o: %.c $(PROJECT).h 
    $(COMPILE) -c $< 

clean: 
    rm -f *.o libopt.a 
+0

Vous devez probablement faire un 'make clean' d'abord, pour se débarrasser du fichier .a. –

+0

Nah l'a essayé, ne fonctionne pas. – jon2512chua

Répondre

2

Le problème réside avec le libproj2.a fourni. Contactez le fournisseur de la bibliothèque pour obtenir de l'aide.

1

l'erreur vous dit le problème. Vous devez exécuter ranlib dans l'archive. Cependant, votre Makefile entier peut être beaucoup simplifié. Si vous comptez sur des règles par défaut, ne pas besoin de l'archive pour quelque chose d'autre, et d'utiliser gnu make, votre Makefile entier peut être réduite à:

 
PROJECT = mysync 
CC = gcc 
CFLAGS = -std=c99 -Wall -pedantic -Werror 
OPT_OBJ = option_a.o option_m.o option_n.o option_p.o option_r.o option_u.o option_v.o 
MAIN = print.o process.o sync.o 

all: $(PROJECT) 
mysync: $(MAIN) $(OPT_OBJ) 
clean: 
    rm -f *.o 

REMARQUE: ce Makefile ignorer la dépendance des règlements ultérieurs de mysync.h. Vous pouvez récupérer que avec des lignes comme:

 
$(MAIN): $(PROJECT).h 

En d'autres termes: utiliser les conventions standard (CC, CFLAGS), et ne pas la peine la construction d'une bibliothèque.

+0

Hey merci pour le conseil. Je ne savais pas que je peux simplifier un makefile avec des règles par défaut. Cependant, j'ai toujours le problème. Premièrement, ranlib ne fonctionne pas, il affiche toujours l'erreur après l'avoir exécuté. Deux, je pense que vous avez confondu l'erreur avec libopt.a, mais en fait c'est avec libproj2.a, qui est un fichier fourni qui est censé fonctionner. – jon2512chua

+0

@ jon2512chua - vous avez raison, je n'ai pas remarqué que le problème est avec libproj2.a. Que se passe-t-il lorsque vous exécutez ranlib sur libproj2.a? –

+0

ranlib: libproj2.a: Archive mal formée – jon2512chua