c++ - Makefile:对 'std::...' 的 undefined reference

标签 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)'

该项目本身与计算机科学无关 - 这只是我们必须提供可交付成果的格式,所以我对我为使其发挥作用所付出的努力感到有点沮丧。

非常感谢大家提供的任何帮助!

最佳答案

改变

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/

相关文章:

c++ - 使用 Pair 模板实现 List 模板

c++ - 计算球体周围的点

PHP 文件时间函数 - "stat failed for"

ruby - OS X Mountain Lion : gcc-4. 2 没有那个文件或目录

c++ - 查找所有子目录下的所有头文件

gcc - CFLAGS、CCFLAGS、CXXFLAGS - 这些变量到底控制什么?

c++ - 如何重载运算符=

android - 在 Android 中使用图像和音频创建视频

linux - 如何在字符串中的任意位置随机添加单个特殊字符? bash

php - 将多行linux发送到PHP exec()