c - Makefile编译两次不同的定义

标签 c makefile

我正在尝试使用相同的源构建两个二进制文件,只是定义不同。 基本上我现在正在做的是:

OBJ     =       $(SRC:.cpp=.o)

CPPFLAGS_S =    $(INC) -Wall -Wextra -O3 -g -D SERVER
CPPFLAGS_C =    $(INC) -Wall -Wextra -O3 -g -D CLIENT

server: CPPFLAGS= $(CPPFLAGS_S)
client: CPPFLAGS= $(CPPFLAGS_C)

server: $(OBJ)
    g++ $(OBJ) -o $(NAME_S) $(CPPFLAGS_S) $(LIB)

client: $(OBJ)
    g++ $(OBJ) -o $(NAME_C) $(CPPFLAGS_C) $(LIB)

all: server client

显然它不起作用。它正在做的是使用 SERVER 定义编译所有内容,并且因为 .o 文件已经存在,它们将再次用于创建客户端二进制文件,仍然使用 SERVER 定义。我需要一些帮助。

最佳答案

嗯,这是文件系统的一个非常基本的原则,即在同一目录中只能有一个具有给定名称的文件。 make 对此无能为力!

因此您有三种选择:您可以在构建每个目标后删除所有目标文件,或者您可以为每个目标创建不同名称的目标文件,或者您可以将对象构建到每个目标的不同子目录中。

我个人更喜欢后者,所以你需要编写新的规则来解释如何在子目录中创建文件:

SERVEROBJ  =       $(SRC:%.cpp=server/%.o)
CLIENTOBJ  =       $(SRC:%.cpp=client/%.o)

CXX        =       g++
CPPFLAGS   =       $(INC)
CXXFLAGS   =       -Wall -Wextra -O3 -g

server: CPPFLAGS += -DSERVER
client: CPPFLAGS += -DCLIENT

all: server client

server client:
        $(CXX) $^ -o $@ $(CXXFLAGS) $(LIB)

server: $(SERVEROBJ)
client: $(CLIENTOBJ)

server/%.o: %.cpp
        mkdir -p $(@D)
        $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
client/%.o: %.cpp
        mkdir -p $(@D)
        $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<

关于c - Makefile编译两次不同的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19744469/

相关文章:

c - 如何修复C语言中的 "Conditional jump or move depends on uninitialised value(s)"错误

linux - 如何为汇编语言程序制作 Makefile?

build - pkg-config:与平台无关的方法来查找将我的.pc文件安装在哪里?

c - 寻找完美的 Makefile Canvas

c - 如何让 SWIG 自动将模拟的 "this"指针包装到 C 结构?

c - 返回 libc - 问题

makefile - 如何强制 make 始终更新并重新读取包含的 makefile?

c++ - 用于 Linux 上 C++ 的带有 GUI 的调试器

c - 在 C 中使用 fread() 从二进制文件读取时出现奇怪的值

c - 棘手的指针别名问题