【发布时间】:2019-02-03 19:31:39
【问题描述】:
我的 Makefile 每次运行它时都会编译所有文件,尽管这些文件没有被更改。我知道这个问题已经被问过好几次了,但提供的解决方案似乎都不适合我。我是 Makefile 新手,大多数时候我不理解解决方案中使用的行话。另外,我想将所有生成的 .o 文件保存在“obj”文件夹下
这是我的文件夹结构
project (-)
gen (-)
display (-)
.c and .h files
logic (-)
.c and .h files
lib (-)
include (-)
.h files
.lib files
man (-)
.c and .h files
obj (-)
want to save all the .o files here
我正在使用 MinGW 在 Windows 操作系统上运行它
这是我的 Makefile:
ALL: demo
SRCS:= filename1.o filename2.o filename3.o filename4.o and so on till filename27.o
demo: display.o logic.o man.o
gcc $(SRCS) -lglut32 -loglx -lopengl32 -Llib -o demo
display.o:
gcc -Igen/display -Igen/logic -Iman -Ilib/include gen/display/*.c -lglut32 -loglx -lopengl32 -Llib -c
logic.o:
gcc -Igen/display -Igen/logic -Iman -Ilib/include gen/logic/*.c -lglut32 -loglx -lopengl32 -Llib -c
man.o:
gcc -Igen/display -Igen/logic -Iman -Ilib/include man/*.c -lglut32 -loglx -lopengl32 -Llib -c
clean:
@echo "Cleaning up.."
-rm -rf *.o
-rm *.exe
注意: glut 和 oglx 文件存在于 lib 文件夹中。 Display.o、lib.o 和 man.o 没有对应的 .c 文件。它们只是文件夹名称,其中包含许多 c 文件。
我知道这可能是问题所在。由于没有创建 display.o、logic.o 和 man.o 文件,因此 MAKE 始终遵守与其关联的规则。那么我如何告诉它检查实际的 .o 文件名 1.o、文件名 2.o 等以获取时间戳,并且仅当它们比相应的 c 文件和 h 文件甚至它们所依赖的 lib 文件更旧时才重新编译。
我尝试了以下方法来创建依赖项并避免每次都编译文件。但这没有帮助。
%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
【问题讨论】:
-
你有什么问题?你在做什么,你期望发生什么,实际发生了什么?
-
对不起,我以为标题很清楚。我的问题是我的 Makefile 每次运行时都会编译所有文件。我不希望这种情况发生。另外,正如我帖子的最后一行所述,我希望将所有 .o 文件保存在文件夹 obj 下。那么我该怎么做这两件事呢?
标签: gcc makefile compilation