【问题标题】:Make - Undefined Reference (C++)Make - 未定义的引用 (C++)
【发布时间】:2013-12-21 18:28:46
【问题描述】:

我查看了其他人提出的问题,但似乎没有一个解决方案有效。我对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.

Player 在Classes 中定义,List&lt;&gt;::gotoEnd() 在DataStructures 中定义。

让我更加困惑的是,在调用gotoEnd() 之后的那一行是对同一标题中定义的另一个函数的调用。如果我注释掉 gotoEnd() 调用,那么即使存在其他函数,我也不会收到编译器错误。

我有 7 个文件:

Main.cpp:#includes "Classes.h" 和 "DataStructures.cpp"

bzstrlib.h:不包含任何头文件

DataStructures.h:不包含任何标题

Classes.h:#includes "DataStructures.h"

bzstrlib.cpp:#includes "bzstrlib.h"

DataStructures.cpp:#includes "DataStructures.h"

Classes.cpp:#includes “bzstrlib.h”、“Classes.h”和“DataStructures.h”

【问题讨论】:

  • 你为什么不用make的隐含规则?
  • 向我解释您所指的具体规则。我从来不明白makefile是如何工作的。我想确切地知道我做错了什么以及在哪里;我在这里阅读了无数其他问题,但无法理解答案,因为它们并不特定于我的场景。
  • @user1362548 让一个像样的 IDE(例如 Eclipse CDT)为您生成一些并研究这些以获得第一手!
  • Classes.o 应该有 DataStructures.h 作为先决条件,但这不会导致此错误。你能告诉我们DataStructures.cpp吗?

标签: c++ header makefile include


【解决方案1】:

如果List&lt;&gt;::gotoEnd 的实际实现在DataStructures.cpp 中,那么您可能遇到的问题是编译器尚未实例化List&lt;Card&gt;::gotoEnd()。您必须要求它明确这样做。

您可以通过将以下行添加到DataStructures.cpp 来强制编译器发出List&lt;Card&gt; 的实现:

template class List<Card>;

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

【讨论】:

  • 添加该行时出现错误:expected unqualified-id before ';' token。
  • 请看我的编辑; template 之后我忘记了 class 这个词。
猜你喜欢
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
相关资源
最近更新 更多