如何在具有多个可执行文件的 makefile 中设置定义

问题描述 投票:0回答:0

我正在尝试编译共享许多相同源文件的游戏(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 目标中的一个添加定义并复制当前目标文件,这样我就可以单独编译共享相同源代码的两个程序?

c makefile compilation cflags
© www.soinside.com 2019 - 2024. All rights reserved.