сделать не работает, как ожидалось - PullRequest
0 голосов
/ 22 октября 2010

Привет, ребята, я написал make-файл, который прекрасно работает на моем 27-дюймовом iMac, работающем дома с Snow Leopard, однако, когда я загрузил его на компьютер моего универа, 24-дюймовый Snow Leopard, он получает следующее:

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

Вот мой make-файл:

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

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Проблема заключается в предоставленном libproj2.a.Обратитесь за помощью к поставщику библиотеки.

1 голос
/ 22 октября 2010

Ошибка говорит вам о проблеме.Вам нужно запустить ranlib в архиве.Однако весь ваш Makefile может быть значительно упрощен.Если вы полагаетесь на правила по умолчанию, вам не нужен архив для чего-то другого и используете gnu make, весь ваш Makefile может быть уменьшен до:

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

ПРИМЕЧАНИЕ: этот исправленный Makefile игнорирует зависимость mysync.h,Вы можете восстановить это с помощью таких строк:

$(MAIN): $(PROJECT).h

Другими словами: используйте стандартные соглашения (CC, CFLAGS) и не беспокойтесь о создании библиотеки.

...