【问题标题】:Simple makefile for C++C++ 的简单生成文件
【发布时间】:2015-06-27 21:00:00
【问题描述】:

我在完成 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 tosum(double*, int)'

如果我运行命令 g++ main.cpp summation.cpp average.cpp -o main 然后它将毫无问题地编译。

我不确定我是否有问题,或者我是否遗漏了什么。环顾四周,我发现了很多信息,但似乎超出了我的想象。

【问题讨论】:

  • 您还应该看到生成错误的编译器命令 make run。那是什么?
  • 将 CXX 定义为“echo g++”,然后运行并享受提示
  • 为什么{OBJS} 被提及两次:${CXX} ${CXXFLAGS} ${OBJS} -o ${MAIN} ${OBJS}?我认为正确的是${CXX} ${CXXFLAGS} ${OBJS} -o ${MAIN}

标签: c++ compilation makefile


【解决方案1】:

我认为你有两个问题。

首先,订购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 *~.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2021-04-07
    相关资源
    最近更新 更多