嘿伙计们我写了一个makefile,它在家里运行Snow Leopard的27“iMac上工作得很好,但是当我把它上传到我的uni的电脑上时,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
以下是我的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 :(得分:2)
问题在于提供的libproj2.a。联系图书馆提供商以获得支持。
答案 1 :(得分:1)
错误告诉您问题所在。您需要在存档上运行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),而不是 麻烦建立一个图书馆。