2010-01-19 74 views
1

gcc 4.4.2 c89編寫Makefile時的最佳做法

我寫了這個Makefile。我想知道這是一個好的設計,容易維護嗎?

我在想的是cltsvr_ults.oSVR_OBJECTSCLT_OBJECTS都有關聯。這看起來是否正確?

非常感謝您的任何建議,

# ------------- SOURCE FILE ------------------------ 
SVR_OBJECTS = server.o cltsvr_ults.o test_svr.o 
CLT_OBJECTS = client.o cltsvr_ults.o test_clt.o 

# ------------- COMPILER OPTIONS ------------------- 
CFLAGS = -ggdb -Wall -pthread -std=c89 
CC = gcc 
PLATFORM = -DLINUX 
LIBS = -lpthread 

# ------------- TARGETS ---------------------------- 
all: svr clt 

svr: $(SVR_OBJECTS) 
    $(CC) $(CFLAGS) $(PLATFORM) $(SVR_OBJECTS) -o svr 

clt: $(CLT_OBJECTS) 
    $(CC) $(CFLAGS) $(PLATFORM) $(CLT_OBJECTS) -o clt 

clean: 
    rm -f clt svr *.o *~ 

# -------------- DEPENDENCIES --------------------- 
server.o: server.h 
client.o: client.h 
test_svr.o: test_svr.c 
test_clt.o: test_clt.c 
cltsvr_ults.o: cltsvr_ults.h 

svr.o:  server.h cltsvr_ults.h test_svr.c 
clt.o:  client.h cltsvr_ults.h test_clt.c 

回答

5

我會做的唯一的建議就是依靠默認規則。 IOW,如果你只是寫:

 
CFLAGS := -ggdb -Wall -pthread -std=c89 
CPPFLAGS := -DLINUX 
LOADLIBES := -lpthread 
CC := gcc 
all: svr clt 
svr: $(SVR_OBJECTS) 
clt: $(CLT_OBJECTS) 
...snip... 

沒有明確寫SVR的規則,那麼(gnumake的)會產生正確的規則。但是,這可能不適用於所有不同口味的產品。如果這是一個問題,你使用automake要好得多。 (換句話說,除非必須,否則不要擔心Make的可移植性,但是如果您不想手動編寫Makefile的話)。請注意,您必須使用LOADLIBES而不是LIBS來使默認規則正常工作爲你。

+0

更好地使用LDLIBS而不是LOADLIBES ..每個保羅史密斯https://lists.gnu.org/archive/html/help-make/2005-01/msg00063.html – UpAndAdam 2015-10-07 15:37:19