我没有使用 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)'
该项目本身与计算机科学无关 - 这只是我们必须提供可交付成果的格式,所以我对我为使其发挥作用所付出的努力感到有点沮丧。
非常感谢大家提供的任何帮助!
最佳答案
改变
CXX = gcc
到
CXX = g++
原因是
$(PROG): ${OBJ}
$(CXX) ${FFLAGS} $(OBJ) -o ${PROG}
规则目前使用 C 编译器进行最终链接,但 C++ 对象需要一些特殊处理。基本上是 -lstdc++
,您可以添加它,但最好只将 C++ 编译器用于最终链接,尤其是因为名为 CXX
的变量通常表示 C++ 编译器,而不是 C 编译器。
仅供引用,就风格而言,最好将 ${...}
(shell 语法)替换为 $(...)
(正常的 Makefile 语法) ).
关于c++ - Makefile:对 'std::...' 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43289851/