2017-04-08 116 views
0

我沒有Unix的經驗,並且C++的經驗非常有限。我最近分配了一個編碼項目,要求我們提供C++源代碼和一個makefile。Makefile:未定義引用'std :: ...'

教授給了一個示例makefile,並提到我們應該嚴格按照它的格式。我試圖讓它爲一個單獨的文件「main.cpp」工作,我可以在下載MinGW和Cygwin後從終端編譯和運行。但是,試圖運行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 [email protected] ${FFLAGS} $< 

.F90.o: 
    ${FC} -c -o [email protected] ${FFLAGS} $< 

.c.o: 
    ${CC} -c -o [email protected] ${FFLAGS} $< 

.cpp.o: 
    ${CXX} -c -o [email protected] ${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

變化

CXX = gcc 

CXX = g++ 

的原因是

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

規則目前正在使用的最後一個環節,C編譯器,但C++對象需要一點點一點特殊待遇。基本上你可以添加-lstdc++,但是最好是使用C++編譯器代替最終鏈接,尤其是因爲名爲CXX的變量通常代表C++編譯器,而不是C編譯器。僅供參考,最好用$(...)(正常的Makefile語法)代替${...}(shell語法)。

+0

哇。這樣一個簡單的修復,現在一切正常。非常感謝您的幫助,以及我可以實際遵循的解釋! –

+0

您也可以使用'$ {CXXFLAGS}'來代替'FFLAGS',因爲語言選項可能不同,所以使用CXX進行C++編譯。 –

相關問題