Macos 使不按预期工作

Macos 使不按预期工作,macos,makefile,archive,Macos,Makefile,Archive,嘿,伙计们,我写了一个makefile,它在我的27英寸iMac家用雪豹电脑上运行得非常好,但是当我把它上传到我大学的电脑上,一个24英寸的雪豹电脑上时,它得到了以下信息: 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

嘿,伙计们,我写了一个makefile,它在我的27英寸iMac家用雪豹电脑上运行得非常好,但是当我把它上传到我大学的电脑上,一个24英寸的雪豹电脑上时,它得到了以下信息:

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
PROJECT=mysync
编译=gcc-std=c99-Wall-pedantic-Werror
OPT_OBJ=option_a.o option_m.o option_n.o option_p.o option_r.o option_.o option_v.o
MAIN=print.o process.o sync.o
$(项目):$(项目).c$(主)libproj2.a libopt.a
$(编译)-o mysync$(PROJECT.c$(MAIN)libproj2.a libopt.a
libopt.a:$(OPT_OBJ)
ar-rc libopt.a$(OPT_OBJ)
%.o:%.c$(项目).h
$(编译)-c$<
清洁:
rm-f*.o libopt.a

错误告诉您问题所在。您需要在存档上运行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 PROJECT=mysync CC=gcc CFLAGS=-std=c99-墙壁-学究式-Werror OPT_OBJ=option_a.o option_m.o option_n.o option_p.o option_r.o option_.o option_v.o MAIN=print.o process.o sync.o 全部:$(项目) mysync:$(主)$(OPT_OBJ) 清洁: rm-f*.o 注意:此文件忽略mysync.h依赖项。你 可以使用以下行来恢复:

$(MAIN): $(PROJECT).h $(主):$(项目).h 换句话说:使用标准约定(CC、CFLAGS),不要
费心建一个图书馆

错误告诉您问题所在。您需要在存档上运行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 PROJECT=mysync CC=gcc CFLAGS=-std=c99-墙壁-学究式-Werror OPT_OBJ=option_a.o option_m.o option_n.o option_p.o option_r.o option_.o option_v.o MAIN=print.o process.o sync.o 全部:$(项目) mysync:$(主)$(OPT_OBJ) 清洁: rm-f*.o 注意:此文件忽略mysync.h依赖项。你 可以使用以下行来恢复:

$(MAIN): $(PROJECT).h $(主):$(项目).h 换句话说:使用标准约定(CC、CFLAGS),不要
费心建一个图书馆

问题在于提供的libproj2.a。请与库提供商联系以获得支持。

问题在于提供的libproj2.a。请与库提供商联系以获得支持。

您可能需要先执行
清除
以清除.a文件。您可能需要先执行
清除
以清除.a文件。嘿,谢谢您的建议。我不知道我可以用默认规则简化生成文件。但是我仍然有这个问题。第一,ranlib不工作,在我运行它之后,它仍然显示错误。第二,我认为您错误地将错误理解为libopt.a,但事实上是libproj2.a,这是一个提供的文件,应该可以工作。@jon2512chua--您是对的,我没有注意到libproj2.a有问题。在libproj2.a上运行ranlib时会发生什么?ranlib:libproj2.a:格式错误archive@jon2512chua(抱歉耽搁了)听起来好像分发有问题。无论谁为您正在构建的应用程序提供源代码,都应该为您提供3个不同的项目(每个库一个,应用程序一个),或者一个包含整个应用程序源代码的独立项目(没有库)。您应该将问题作为bug报告给提供libproj2.a的人员,并请求该库的源代码,以便您可以构建它。谢谢你的帮助。嘿,谢谢你的建议。我不知道我可以用默认规则简化生成文件。但是我仍然有这个问题。第一,ranlib不工作,在我运行它之后,它仍然显示错误。第二,我认为您错误地将错误理解为libopt.a,但事实上是libproj2.a,这是一个提供的文件,应该可以工作。@jon2512chua--您是对的,我没有注意到libproj2.a有问题。在libproj2.a上运行ranlib时会发生什么?ranlib:libproj2.a:格式错误archive@jon2512chua(抱歉耽搁了)听起来好像分发有问题。无论谁为您正在构建的应用程序提供源代码,都应该为您提供3个不同的项目(每个库一个,应用程序一个),或者一个包含整个应用程序源代码的独立项目(没有库)。您应该将问题作为bug报告给提供libproj2.a的人员,并请求该库的源代码,以便您可以构建它。谢谢你的帮助。