C++ 的简单生成文件

Simple makefile for C++

我在 CS class 的编程作业中遇到了一些问题。本周向我们介绍了 makefile,但几乎没有涉及。目标是编写一个程序来计算用户提供的双打的平均值和总和。该程序在 g++ 上运行良好,但我的 makefile 有问题。

我正在处理 3 个 cpp 文件:main.cpp、average.cpp、summation.cpp。 和 2 个头文件:average.h 和 summation.h

这是我试过的一个 make 文件:

CXX = g++
CXXFLAGS = -std=c++0x -Wall -pedantic-errors -g

SRCS = summation.cpp average.cpp main.cpp 
OBJS = ${SRCS:.cpp=.o}
HEADERS = summation.h average.h

MAIN = myprog

all: ${MAIN}
    @echo   Simple compilter named myprog has been compiled

${MAIN}: ${OBJS} ${HEADERS}
    ${CXX} ${CXXFLAGS} ${OBJS} -o ${MAIN} ${OBJS}

.cpp.o:
    ${CXX} ${CXXFLAGS} -c $< -o $@

clean:
    ${RM} ${PROGS} ${OBJS} *.o *~

错误: main.cpp:31: 对 avg(double*, int)' main.cpp:32: undefined reference tosum(double*, int)'

的未定义引用

如果我运行命令 g++ main.cpp summation.cpp average.cpp -o main 然后它会编译没有任何问题。

我不确定我是否有什么东西出了问题,或者我是否遗漏了什么。环顾四周,我找到了很多信息,但似乎无法理解。

我认为你这里有两个问题。

首先,排序SRCS = summation.cpp average.cpp main.cpp。这会导致 .osummation.o average.o main.o 的顺序提供给 g++,从而导致未定义的错误。您希望按 main.o summation.o average.o 的顺序提供它们,因此 SRCS 应该是 SRCS = main.cpp summation.cpp average.cpp.

其次,在行中:

${CXX} ${CXXFLAGS} ${OBJS} -o ${MAIN} ${OBJS}

不需要第二个${OBJS}
尝试以下操作:

CXX = g++
CXXFLAGS = -std=c++0x -Wall -pedantic-errors -g

SRCS =  main.cpp summation.cpp average.cpp
OBJS = ${SRCS:.cpp=.o}
HEADERS = summation.h average.h

MAIN = myprog

all: ${MAIN}
        @echo   Simple compilter named myprog has been compiled

${MAIN}: ${OBJS}
        ${CXX} ${CXXFLAGS} ${OBJS} -o ${MAIN}

.cpp.o:
        ${CXX} ${CXXFLAGS} -c $< -o $@

clean:
        ${RM} ${PROGS} ${OBJS} *.o *~.