2013-11-02 56 views
1

我正在嘗試使用相同的源創建兩個二進制文件,只是使用不同的定義。 基本上我在做什麼現在的問題是: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定義。我可以使用一些幫助。

+0

要麼你需要生成不同的.o文件名客戶端和服務器,或者編譯客戶端時需要丟棄所有.o文件,而最後編譯的二進制文件是服務器。此外,.o文件需要(大概)自己被編譯爲相應的標誌? 第一種情況可以通過爲客戶端和服務器.o文件使用不同的名稱並使用替換來完成,第二種情況可以通過具有「客戶端」和「服務器」所依賴的規則來完成,其中刪除所有的。 o文件取決於二進制文件的時間戳。 – user234461

回答

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 [email protected] $(CXXFLAGS) $(LIB) 

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

server/%.o: %.cpp 
     mkdir -p $(@D) 
     $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o [email protected] $< 
client/%.o: %.cpp 
     mkdir -p $(@D) 
     $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o [email protected] $< 
+0

^這! (我的建議,但更多雄辯!) – user234461