你的隐含规则是罪魁祸首.它们具有以与make如何理解它们相反的顺序列出的扩展名.
.o.c:
告诉make .c文件是从.o文件创建的.由于已经存在一条规则,即.o文件是从.c文件创建的,因此您具有循环依赖关系,因此存在错误.
解决方案是(或应该是,假设合理配置的make)简单.
您(通常)不需要在常见的情况下(例如C++源代码)指定自己的编译规则.只需指定类似的内容会更简单:
CFLAGS=-Wall LOADLIBES=-lGL -lglut -ljpeg OBJS=helpers.o loadobj.o zpr.o readjpeg.o readppm.o SceneNode.o \ BoundingBoxNode.o GeometryNode.o SceneGraph.o testgraph.o all: testgraph testgraph: $(OBJS)
这可能也可以帮助您避免两个错误.
你写的规则说.o文件是从.c文件创建的,这是向后的.c文件.但几乎所有版本的make中都存在正确的规则.
您已在目标文件之前列出了库.这在使用ELF格式对象的某些平台上偶然起作用.但它仍然是错误的.在对象之后列出库,因为仅加载库以满足未定义的外部.