【发布时间】:2021-12-27 21:47:21
【问题描述】:
我有一个简单的 makefile 来编译一些使用 OpenGL 库的 C 代码,但是,它似乎将它自己的规则之一解释为要编译的文件。简化版如下:
CC = gcc
COMPILEFLAGS = -Wall -lglut -lGL -lGLU -lm -c
LINKFLAGS = -lglut -lGL -lGLU -lm
castle: castle_link
run_castle:
./castle $(ARGS)
castle_link: castle_compile
${CC} -o castle castle.o ${LINKFLAGS}
castle_compile:
${CC} ${COMPILEFLAGS} castle.c
clean:
rm *.o castle
执行make -n castle 会产生以下结果:
gcc -Wall -lglut -lGL -lGLU -lm -c castle.c
gcc -o castle castle.o -lglut -lGL -lGLU -lm
gcc castle.o castle_link -o castle
我无法理解为什么会发生这种情况。在这个相同的文件上,还有另一组完全遵循相同模式的规则,只是更改文件名,可以完美运行。
(这只发生在执行规则make castle时,手动执行castle_compile然后castle_link不会导致这种情况。
非常感谢任何帮助。
【问题讨论】:
-
相关问题:
COMPILEFLAGS中的-lXYZ选项由于-c选项而未使用,应将其删除。 -
无法重现,我只看到前两行输出。
-
使用
make -d -f makefile.bad castle > output.bad运行输出。然后用另一个你想要的makefile,也运行它make -d -f makefile.good program > output.good。然后比较操作——这将是乏味的。然而,有一个关键的区别。我们无法为您发现它,因为我们没有其他 makefile 可供比较。 -
IMO,最好多利用内置规则。设置
CFLAGS = -Wall、LDLIBS = -lglut -lGL -lGLU -lm。写castle: castle.o,后面没有命令;完全删除castle_link和castle_compile,然后代码可以正常工作——它将castle.c编译为castle.o,然后将其与库链接以生成可执行文件。然而,这并不能解释为什么你会看到你所看到的。 -
请注意,如果您只编写
castle:而没有castle.o作为依赖项,则会执行一个命令:gcc -Wall castle.c -lglut -lGL -lGLU -lm -o castle,如果您没有特定用途,这可能很好目标文件。