我没有使用Unix的经验,也没有非常有限的C ++经验。我最近被分配了一个编码项目,要求我们提供C ++源代码和makefile。
教授给出了一个样本makefile,并提到我们应该完全遵循它的格式。我试图让它为单个文件“main.cpp”工作,我可以在下载MinGW和Cygwin之后使用终端编译和运行。但是,尝试运行makefile会导致一堆“未定义的引用...”错误。
makefile是:(我改变的只是项目和目标文件的名称)
VPATH = ./src:
.SUFFIXES : .F90 .f .f90 .c .o
# Compiler types
FC = gfortran
CC = gcc
CXX = gcc
# Optimization level
OPT = -O2
# Relevant flags
FFLAGS = ${OPT}
CFLAGS = ${OPT}
CXXFLAGS = ${OPT}
# Name of the program
PROG = main.x
# List of object files
OBJ = main.o
.f90.o:
${FC} -c -o $@ ${FFLAGS} $<
.F90.o:
${FC} -c -o $@ ${FFLAGS} $<
.c.o:
${CC} -c -o $@ ${FFLAGS} $<
.cpp.o:
${CXX} -c -o $@ ${FFLAGS} $<
all:${PROG}
$(PROG): ${OBJ}
$(CXX) ${FFLAGS} $(OBJ) -o ${PROG}
mv ${PROG} ./bin/
clean:
/bin/rm -f *.mod *.o *.x *~ ./src/*.o ./src/*~
uninstall:
rm -f bin/${PROG}
renew:
touch *
我得到的错误列表的片段是:
main.o:main.cpp:(.text.startup+0x1e): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)'
main.o:main.cpp:(.text.startup+0x1e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)'
项目本身与计算机科学无关 - 这只是我们必须提供的可交付成果的格式,所以我对我努力工作的程度感到有些沮丧。
非常感谢大家给予的任何帮助!
答案 0 :(得分:1)
更改
CXX = gcc
到
CXX = g++
原因是
$(PROG): ${OBJ}
$(CXX) ${FFLAGS} $(OBJ) -o ${PROG}
规则目前正在使用C编译器进行最终链接,但C ++对象需要一些特殊处理。基本上-lstdc++
,您可以添加,但最好只使用C ++编译器代替最终链接,特别是因为名为CXX
的变量通常代表C ++编译器,而不是C编译器。
仅供参考,从风格上来说,最好用${...}
替换$(...)
(shell语法)(普通的Makefile语法)。