我有一个简单的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
答案 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
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
$
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