简单的C ++ makefile

时间:2015-06-27 21:00:00

标签: c++ compilation makefile

我在为CS类编程分配时遇到了一些麻烦。本周我们介绍了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 to sum(double *,int)&#39;

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

我不确定我是否有任何故障,或者我是否遗漏了某些东西。环顾四周,我发现了很多信息,但似乎已经超出了我的想法。

1 个答案:

答案 0 :(得分:5)

我认为你有两个问题。

首先,排序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 *~.