Makefile:对'std :: ...'的未定义引用

时间:2017-04-08 03:30:13

标签: c++ unix makefile compiler-errors

我没有使用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)'

项目本身与计算机科学无关 - 这只是我们必须提供的可交付成果的格式,所以我对我努力工作的程度感到有些沮丧。

非常感谢大家给予的任何帮助!

1 个答案:

答案 0 :(得分:1)

更改

CXX = gcc

CXX = g++

原因是

$(PROG): ${OBJ}
    $(CXX) ${FFLAGS} $(OBJ) -o ${PROG}

规则目前正在使用C编译器进行最终链接,但C ++对象需要一些特殊处理。基本上-lstdc++,您可以添加,但最好只使用C ++编译器代替最终链接,特别是因为名为CXX的变量通常代表C ++编译器,而不是C编译器。

仅供参考,从风格上来说,最好用${...}替换$(...)(shell语法)(普通的Makefile语法)。