1

定義が異なるだけで、同じソースで 2 つのバイナリをビルドしようとしています。基本的に私が今やっていることは次のとおりです。

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 定義を引き続き使用してクライアント バイナリを作成するために再度使用されます。私はいくつかの助けを使うことができます。

4

1 に答える 1

5

同じディレクトリ内に特定の名前のファイルを 1 つしか持てないというのは、ファイルシステムの非常に基本的な信条です。それについてmakeができることはあまりありません!

したがって、3 つの選択肢があります。各ターゲットをビルドした後ですべてのオブジェクト ファイルを削除するか、ターゲットごとに異なる名前のオブジェクト ファイルを作成するか、オブジェクトをターゲットごとに異なるサブディレクトリにビルドするかです。

個人的には後者の方が好きなので、サブディレクトリにファイルを作成する方法を説明する新しいルールを書く必要があります:

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 $@ $<
于 2013-11-02T17:18:57.127 に答える