制作 - 未定义参考(C ++)

时间:2013-12-05 01:06:22

标签: c++ header makefile include

我已经查看了其他人提出的问题,但没有一个解决方案似乎有效。我对makefile编译不够了解。但这是我的makefile:

program.out:    bzstrlib.o DataStructures.o Classes.o main.o
            g++ -o program.out bzstrlib.o DataStructures.o Classes.o main.o

bzstrlib.o:     bzstrlib.cpp bzstrlib.h
            g++ -c bzstrlib.cpp

DataStructures.o:   DataStructures.cpp DataStructures.h
            g++ -c DataStructures.cpp

Classes.o:      Classes.cpp Classes.h
            g++ -c Classes.cpp

main.o:         main.cpp bzstrlib.cpp bzstrlib.h DataStructures.cpp DataStructures.h Classes.cpp Classes.h
            g++ -c main.cpp

clean:
            rm *.o program.out

我必须设置错误,因为我不断收到错误消息Classes.o: In function 'Player::dealCard(Card const&)': Classes.cpp:(.text+0x735): undefined reference to 'List<Card>::gotoEnd()' collect2: ld returned 1 exit status.

PlayerClasses中定义,List<>::gotoEnd()DataStructures中定义。

令我困惑的是,在调用gotoEnd()之后的行上就是对同一标头中定义的另一个函数的调用。如果我注释掉gotoEnd()调用,那么即使其他函数存在,我也没有编译器错误。

我有7个文件:

Main.cpp:#include s“Classes.h”和“DataStructures.cpp”

bzstrlib.h:不包含任何标题

DataStructures.h:不包含任何标题

Classes.h:#include s“DataStructures.h”

bzstrlib.cpp:#include s“bzstrlib.h”

DataStructures.cpp:#include s“DataStructures.h”

Classes.cpp:#include s“bzstrlib.h”,“Classes.h”和“DataStructures.h”

1 个答案:

答案 0 :(得分:0)

如果List<>::gotoEnd的实际实现位于DataStructures.cpp,那么您可能遇到的问题是编译器尚未实例化List<Card>::gotoEnd()。您必须要求它明确地

您可以通过将以下行添加到List<Card>来强制编译器为DataStructures.cpp发出实现:

template class List<Card>;

这称为显式实例化,当模板化类的部分或全部实现与标头位于不同的.cpp文件中时,某些编译器需要这样做。更多信息:http://en.cppreference.com/w/cpp/language/class_template(向下滚动到显式实例化)。