我正在尝试编译共享许多相同源文件的游戏(program1.exe)和编辑器(program2.exe),目前我在源文件中使用#define,但我想自动执行此操作可能并将其移动到 makefile.
下面的文字是这种情况的一个简短例子。
制作文件:
all: Program1.exe
CC=gcc
CFLAGS=-Wall
OBJECTS= .obj/main.o .obj/test.o .obj/example.o\
Program1.exe: $(OBJECTS)
$(CC) -o "$@" $^
Program2.exe: $(OBJECTS)
$(CC) -o "$@" $^
.obj/main.o: main.c test.h example.h
$(CC) -c -o $@ $< $(CFLAGS)
.obj/test.o: test.c test.h
$(CC) -c -o $@ $< $(CFLAGS)
.obj/example.o: example.c example.h
$(CC) -c -o $@ $< $(CFLAGS)
two: Program2.exe
基本上运行'make'编译Program1.exe,而'make two'将编译Program2.exe 只有在编译 program2.exe 时,我才能通过定义
预期结果是这样的: 当我编译 Program1 (make) 时,我希望目标文件移动到 .obj/(这有效) 当我编译 Program2(制作两个)时,我希望目标文件移动到子目录 .obj/editor/ 并且我需要传递一个 define -DEDITOR 以便源文件编译源代码的某些部分。
当我将以下内容添加到 makefile 时:
CFLAGS+= -DEDITOR
它确实有效,但它用那个标志编译了两个程序,这不是我想要的。
我还尝试用不同的子目录名称制作所有对象的副本:
EOBJECTS= .obj/**editor**/main.o .obj/**editor**/test.o .obj/**editor**/example.c\
.obj/**editor**/example.c example.h
$(CC) -c -o $@ $< $(CFLAGS)
然后还添加:
.obj/editor/%.o: CFLAGS += -DEDITOR
Program2.exe: $(**EOBJECTS**)
$(CC) -o "$@" $^
这确实有效,但弄乱了我的 makefile,它的行数非常多,并且不利于将来维护文件,因为我复制了每个对象。
我也尝试了互联网上的常见解决方案,但由于某种原因,这不适用于我的源文件:
Program2.exe: $(**OBJECTS**)
$(CC) **-DEDITOR** -o "$@" $^
有没有办法只向多个 make 目标中的一个添加定义并复制当前目标文件,这样我就可以单独编译共享相同源代码的两个程序?