Makefile不提示编译器使用优化标志

时间:2014-12-26 23:31:19

标签: bash makefile

我有一个简单的makefile,我在bash中使用它来编译C ++程序及其相关的.h文件,而不是每个.h文件都有一个与之关联的.cpp文件。我编写了一个makefile,其中显式调用了每个依赖项,并且CFLAG宏用于每个特定的依赖项,它使用-O3标志进行编译,并且运行速度提高了近3倍。但是,当我使用这个更简单但更复杂的makefile时,它不会使用-O3标志进行编译,即使它明确包含在CFLAG宏中。有人能向我指出我所缺少的东西,我会非常感激。

OBJS = main.o Output_Files.o Calendar.o Random_Number_Generator.o \
       Algorithm.o Statistics.o
DEPS = Output_Files.h Calendar.h Random_Number_Generator.h Algorithm.h \
       Statistics.h 
CC=c++
CFLAGS=-c -Wall -O3

all: economics

%o: %.cpp $(DEPS)
    $(CC) $(CFLAGS) $@ $<

economics: $(OBJS)
    $(CC) $(OBJS)

main.o: main.cpp Data_Parser.h PDF_and_CDF.h
    $(CC) $(CFLAGS) main.cpp 

1 个答案:

答案 0 :(得分:4)

规则:

%o: %.cpp $(DEPS)
    $(CC) $(CFLAGS) $@ $<

应该写一个额外的点:

%.o: %.cpp $(DEPS)
    $(CC) $(CFLAGS) $<

此外,您不希望在命令行中使用$@,或者(如果必须拥有),则需要在-o前加上{。}}。

makefile没有使用错误规则,而是使用默认规则来构建C ++目标文件,而且很可能不使用$(CFLAGS),而是使用$(CXXFLAGS)

CC是C编译器的宏,而不是C ++编译器。通常,这是CXX。此外,构建economics的规则实际上创建了a.out而不是economics

如果你写了:

,我更喜欢它
SRCS = main.cpp Output_Files.cpp Calendar.cpp Random_Number_Generator.cpp \
       Algorithm.cpp Statistics.cpp
OBJS = ${SRCS:.cpp=.o}

…

economics: $(OBJS)
    $(CC) -o $@ $(OBJS)

将所有内容放在一起会产生new.makefile

SRCS = main.cpp Output_Files.cpp Calendar.cpp Random_Number_Generator.cpp \
       Algorithm.cpp Statistics.cpp
OBJS = ${SRCS:.cpp=.o}
DEPS = Output_Files.h Calendar.h Random_Number_Generator.h Algorithm.h \
       Statistics.h
CC = c++
CFLAGS = -c -Wall -O3

all: economics

%.o: %.cpp $(DEPS)
    $(CC) $(CFLAGS) $<

economics: $(OBJS)
    $(CC) -o $@ $(OBJS)

main.o: main.cpp Data_Parser.h PDF_and_CDF.h
    $(CC) $(CFLAGS) main.cpp

使用旧的makefile

运行make -n
$ make -n -f old.makefile
c++ -c -Wall -O3 main.cpp 
c++    -c -o Output_Files.o Output_Files.cpp
c++    -c -o Calendar.o Calendar.cpp
c++    -c -o Random_Number_Generator.o Random_Number_Generator.cpp
c++    -c -o Algorithm.o Algorithm.cpp
c++    -c -o Statistics.o Statistics.cpp
c++ -o economics main.o Output_Files.o Calendar.o Random_Number_Generator.o Algorithm.o Statistics.o
$

使用新的makefile

运行make -n
$ make -n -f new.makefile
c++ -c -Wall -O3 main.cpp 
c++ -c -Wall -O3 Output_Files.cpp
c++ -c -Wall -O3 Calendar.cpp
c++ -c -Wall -O3 Random_Number_Generator.cpp
c++ -c -Wall -O3 Algorithm.cpp
c++ -c -Wall -O3 Statistics.cpp
c++ -o economics main.o Output_Files.o Calendar.o Random_Number_Generator.o Algorithm.o Statistics.o
$

这仍然是基于多个理由编写make规则的异常方式,其中一个是$(CC)$(CXX)更改。通常情况下,-c$(CFLAGS)中不包含$(CXXFLAGS)选项。通常,您也会在链接行中包含$(CFLAGS)$(CXXFLAGS)(因为某些标记可​​能会影响链接)。通常,您也需要链接器行中的库和相关标志。

这导致更正统的命名惯例:

SRCS = main.cpp Output_Files.cpp Calendar.cpp Random_Number_Generator.cpp \
       Algorithm.cpp Statistics.cpp
OBJS = ${SRCS:.cpp=.o}
DEPS = Output_Files.h Calendar.h Random_Number_Generator.h Algorithm.h \
       Statistics.h
CXX  = c++
CXXFLAGS = -Wall -O3
LDFLAGS  =
LDLIBS   =

all: economics

%.o: %.cpp $(DEPS)
    $(CXX) -c $(CXXFLAGS) $<

economics: $(OBJS)
    $(CXX) -o $@ $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LDLIBS)

main.o: main.cpp Data_Parser.h PDF_and_CDF.h
    $(CXX) -c $(CXXFLAGS) main.cpp