使用不同编译器标志的Makefile来编译源文件

5
我可以帮您进行翻译。以下是需要翻译的内容:

如何在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个源文件(预计会增加),因此需要一个易于维护的文件。

提前致谢。

2个回答

12
你可以按照以下方式进行操作(未经测试,因此语法可能略有不同):
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 $@ $^

$(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 $@

@Oli_Charlesworth 有人给我一个C文件,我需要使用其中的函数。你认为将其添加到makefile中的最佳方式是什么? - stormCloud
@user1208914:我不明白问题出在哪儿。为什么不能像对待其他源文件一样对待它呢? - Oliver Charlesworth
由于$(OBJS): %.o: %.cpp这一行代码,它将所有的.o文件更改为.cpp,而c文件是.c。 - stormCloud
@user1208914:啊,我明白了。你可以添加第二个规则 $(OBJS): %.o: %.c $(CC) ...。Make会自动选择适当的规则。 - Oliver Charlesworth

0

这是我编写并在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

header.mk是我们公司的专有UNIX产品,用于跨UNIX平台开发。它根据每个单独的UNIX机器的输出shell uname定义CXX、CC、CXXFLAGS和CFLAGS。我可以在frank_chang91@hotmail.com提供此文件的摘录。谢谢。 - Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接