我正在尝试使用相同的源构建两个二进制文件,只是使用不同的定义。 基本上我现在正在做的是:
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定义。我可以使用一些帮助。
答案 0 :(得分:5)
嗯,这是文件系统的一个非常基本的原则,你只能在同一目录中拥有一个具有给定名称的文件。关于那个没什么可以做的!
所以你有三个选择:你可以在构建每个目标后删除所有目标文件,或者你可以为每个目标创建不同命名的目标文件,或者你可以将对象构建到每个目标的不同子目录中。
我个人更喜欢后者,所以你需要编写新规则来解释如何在子目录中创建文件:
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 $@ $<