2012-02-20 100 views
4

如何在Makefile中爲不同的源文件使用不同的編譯器標誌?例如,我想,這將產生一個Makefile:源文件具有不同編譯器標誌的Makefile

g++ -c -COMPILER_FLAGS_1 -g source1.cpp -o source1.o 

g++ -c -COMPILER_FLAGS_2 -g source2.cpp -o source2.o 
g++ -c -COMPILER_FLAGS_2 -g source3.cpp -o source3.o 
g++ -c -COMPILER_FLAGS_2 -g source4.cpp -o source4.o 

g++ -c -COMPILER_FLAGS_3 -g source5.cpp -o source5.o 
g++ -c -COMPILER_FLAGS_3 -g source6.cpp -o source6.o 
g++ -c -COMPILER_FLAGS_3 -g source7.cpp -o source7.o 

g++ -g -o output source1.o source2.o source3.o source4.o source5.o source6.o source7.o 

目前,我已經得到了約20源文件(而這有望增長),所以易於維護文件將是很好。

在此先感謝。

回答

10

你可以做類似如下(未經測試,所以語法可能會稍有關閉):

OBJS_1 := source1.o 
OBJS_2 := source2.o source3.o source4.o 
OBJS_3 := source5.o source6.o source7.o 

OBJS := $(OBJS_1) $(OBJS_2) $(OBJS_3) 

output: $(OBJS) 
    $(CXX) -g -o [email protected] $^ 

$(OBJS_1): CXXFLAGS := $(COMPILER_FLAGS_1) 
$(OBJS_2): CXXFLAGS := $(COMPILER_FLAGS_2) 
$(OBJS_3): CXXFLAGS := $(COMPILER_FLAGS_3) 

$(OBJS): %.o: %.cpp 
    $(CXX) -c $(CXXFLAGS) -g $< -o [email protected] 
+0

這是非常好的,非常感謝 – stormCloud 2012-02-20 01:48:45

+0

@Oli_Charlesworth有人給了我一個c文件,我需要使用它的功能。你認爲將它添加到makefile的最佳方式是什麼? – stormCloud 2012-02-22 23:58:09

+0

@ user1208914:我不明白這個問題。你爲什麼不能像其他源文件那樣對待它? – 2012-02-23 00:00:29

0

早上好,這裏是UNIX/LINUX的makefile,我寫了和Solaris上的LINUX測試,以處理不同GNUmakefile不同部分的編譯標誌。請讓我知道它是否可以改進。謝謝

# GNUmakefile 
# 
# makefile for mdRightFielder 
# 
# Builds: 
# libmdRightFielder.so or libmdRightFielder.sl 

ifndef SUB 
include ../header.mk 

else 

VPATH=../Source:../Source/PCRE:../Source/SQLite:../../cpswindows/Source:../../util/mdLicense 
INCL=-I../Include -I../Include/PCRE -I../Include/SQLite -I../../cpswindows/Include -I ../../util -I../../util/mdLicense 
APIOBJ=cGlobalDataDestructor.o cPCRE.o CppInterface.o cRightFielder-FillTokenGaps.o 
PCREOBJ=pcre_chartables.o pcre_compile.o pcre_exec.o pcre_fullinfo.o pcre_get.o pcre_globals.o pcre_newline.o \ 
    pcre_tables.o pcre_try_flipped.o 
SQLITEOBJ=sqlite3.o 
CPSWINDOWSOBJ=BinarySearch.o cConfigFile.o cCriticalSection.o cDateTime.o cException.o cFile.o cSQLite.o \ 
    QuickSort.o StringFunctions.o 
MDLICENSEOBJ=CBigNum.o mdLicense.o RSA.o 

ifeq ($(CPU),sparc) 
    ifdef workshop 
     CALIGN=-xmemalign=1s 
     ifdef release 
      CXXALIGN=-Qoption cg -xmemalign=1s 
     else 
      CXXALIGN=-Qoption ccfe -y-xmemalign=1s 
     endif 
    endif 
endif 

COMPILER_FLAGS_1=-D_NO_GUI 
COMPILER_FLAGS_2=-D_NO_GUI -DHAVE_CONFIG_H 


CXXFLAGS+=-DPCRE_STATIC -DUSE_STATIC 
CFLAGS+=-D_NO_GUI -DHAVE_CONFIG_H -DPCRE_STATIC -DUSE_STATIC 
DEPFLAGS+=-DLINK_SIZE=2 -D_NO_GUI -DHAVE_CONFIG_H -DPCRE_STATIC -DUSE_STATIC 

.PHONY: all clean 

all: libmdRightFielder.so 
    cp -fp ../Include/mdRightFielder.h ../../util/mdEnums.h libmdRightFielder.so $(SHIP) 
    if [ `uname` = HP-UX ] ; \ 
    then \ 
     /bin/mv -f $(SHIP)/libmdRightFielder.so $(SHIP)/libmdRightFielder.sl ; \ 
    fi 

clean: 
    rm -f *.o *.so *.sl deps 
    rm -f core core.[0-9]* 

$(APIOBJ): CXXFLAGS+=$(COMPILER_FLAGS_1) 
$(PCREOBJ): CXXFLAGS+=$(COMPILER_FLAGS_2) 

MARYOBJS = $(APIOBJ) $(PCREOBJ) 



libmdRightFielder.so: \ 
    $(MARYOBJS) 
    -$(CXX) $(CXXFLAGS) $(INCL) $(SHARED) $^ -o [email protected] $(LDLIBS) 

mary: 
    %.o : %.cpp # cancel implicit CPP compilation rule 

     %.o : %.cpp 
    $(CXX) $(CXXFLAGS) $(INCL) $(PIC) $< -o [email protected] -c 


     %.o : %.c  # cancel implicit C compilation rule 

     %.o : %.c 
    $(CC) $(CFLAGS) $(INCL) $(PIC) $< -o [email protected] -c 

endif 
+0

header.mk是我們公司用於Cross UNIX平臺開發的專有UNIX產品。它定義了CXX,CC,CXXFLAGS,CFLAGS,取決於每個單獨UNIX機器的輸出shell uname。我可以在[email protected]上提供這個文件的摘錄。謝謝。 – Frank 2012-05-24 14:32:57

相關問題