不按预期工作

时间:2010-10-22 16:02:28

标签: macos makefile archive

嘿伙计们我写了一个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

2 个答案:

答案 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),而不是 麻烦建立一个图书馆。

相关问题