C++ 为源文件使用不同编译器标志的Makefile

C++ 为源文件使用不同编译器标志的Makefile,c++,gcc,makefile,g++,C++,Gcc,Makefile,G++,如何对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 source

如何对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个源文件(预计会增加),所以一个易于维护的文件就很好了


提前感谢。

您可以执行以下操作(未经测试,因此语法可能有点不正确):

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)
输出:$(OBJS)
$(CXX)-g-o$@$^
$(OBJS_1):CXXFLAGS:=$(编译器_标志_1)
$(OBJS_2):CXXFLAGS:=$(编译器_标志_2)
$(OBJS_3):CXXFLAGS:=$(编译器_标志_3)
$(OBJS):%.o:%.cpp
$(CXX)-c$(CXXFLAGS)-g$<-o$@

这是我在Solaris LINUX上编写和测试的UNIX/LINUX makefile,用于处理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 $@ $(LDLIBS)

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

        %.o :  %.cpp
    $(CXX) $(CXXFLAGS) $(INCL) $(PIC) $< -o $@ -c


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

        %.o : %.c
    $(CC) $(CFLAGS) $(INCL) $(PIC) $< -o $@ -c

endif
#GNUmakefile
#
#mdRightFielder的生成文件
#
#构建:
#libmdRightFielder.so或libmdRightFielder.sl
ifndef分包
包括../header.mk
其他的
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 cppcinterface.o cRightFielder FillTokenGaps.o
PCREOBJ=pcre_图表表.o pcre_编译.o pcre_执行.o pcre_完整信息.o pcre_获取.o pcre_全局.o pcre_换行.o\
pcre\u表。o pcre\u尝试\u翻转。o
SQLITEOBJ=sqlite3.o
CPSWINDOWSOBJ=BinarySearch.oCconfig.oCcriticalSection.oCdateTime.oCeException.oCfile.oCsqlite.o\
o StringFunctions.o
MDLICENSEOBJ=CBigNum.o mdLicense.o RSA.o
ifeq($(CPU),sparc)
ifdef研讨会
CALIGN=-xmemalling=1s
ifdef释放
CXXALIGN=-Qoption cg-xmemalign=1s
其他的
CXXALIGN=-Qoption-ccfe-y-xmemalign=1s
恩迪夫
恩迪夫
恩迪夫
编译器\u标志\u 1=-D\u否\u GUI
编译器\u FLAGS\u 2=-D\u NO\u GUI-DHAVE\u CONFIG\u H
CXXFLAGS+=-DPCRE\u STATIC-DUSE\u STATIC
CFLAGS+=-D_NO_GUI-DHAVE_CONFIG_H-DPCRE_STATIC-DUSE_STATIC
DEPFLAGS+=-DLINK\u SIZE=2-D\u NO\u GUI-DHAVE\u CONFIG\u H-DPCRE\u STATIC-DUSE\u STATIC
.骗子:都是干净的
全部:libmdRightFielder.so
cp-fp../Include/mdRightFielder.h.././util/mdEnums.h libmdRightFielder.so$(发货)
如果[`uname`=HP-UX]\
然后\
/bin/mv-f$(SHIP)/libmdRightFielder.so$(SHIP)/libmdRightFielder.sl\
fi
清洁:
rm-f*.o*.so*.sl部门
rm-f核心。[0-9]*
$(APIOBJ):CXXFLAGS+=$(编译器标志1)
$(PCREOBJ):CXXFLAGS+=$(编译器标志2)
MARYOBJS=$(APIOBJ)$(PCREOBJ)
libmdRightFielder.so:\
$(MARYOBJS)
-$(CXX)$(CXXFLAGS)$(包括)$(共享)$^-o$@$(LDLIBS)
玛丽:
%.o:%.cpp#取消隐式cpp编译规则
%.o:%.cpp
$(CXX)$(CXXFLAGS)$(包括)$(PIC)$<-o$@-c
%.o:%.c#取消隐式c编译规则
%.o:%.c
$(CC)$(CFLAGS)$(包括)$(PIC)$<-o$@-c
恩迪夫

@Oli\u Charlesworth有些人给了我一个c文件,我需要使用其中的函数。您认为将其添加到makefile的最佳方式是什么?@user1208914:我不明白这个问题。为什么不能像对待任何其他源文件一样对待它?@Oli_Charlesworth因为行$(OBJS):%.o:%.cpp它将所有.o文件都更改为.cpp,而c文件是一个。c@user1208914:啊,我明白了。您可以添加第二条规则,
$(OBJS):%.o:%.c$(CC).
。Make将自动选择合适的。header.mk是我们公司用于跨UNIX平台开发的专有UNIX产品。它定义了CXX、CC、CXXFLAGS、CFLAGS,具体取决于每个单独UNIX机器的输出shell uname。我可以在frank提供此文件的摘录_chang91@hotmail.com. 非常感谢。
# 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 $@ $(LDLIBS)

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

        %.o :  %.cpp
    $(CXX) $(CXXFLAGS) $(INCL) $(PIC) $< -o $@ -c


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

        %.o : %.c
    $(CC) $(CFLAGS) $(INCL) $(PIC) $< -o $@ -c

endif