【问题标题】:Template build error: Undefined symbols for architecture x86_64:模板构建错误:架构 x86_64 的未定义符号:
【发布时间】:2012-10-15 23:13:20
【问题描述】:

我正在尝试使用模板类,当我在 LWS 的一个文件中编译它时,它可以工作:

(链接已失效) ~http://liveworkspace.org/code/a9c412a7e683439dfa35a9363749369d~

但是当我尝试编译它由 3 个文件组成时,

stack.h 第 4 到 21 行

stack.cpp 第 24 到 48 行

main.cpp 第 49 行到结束

当我尝试编译这 3 个文件时,我得到了

Undefined symbols for architecture x86_64:
  "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::push(Node**, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      _main in ccCoizCT.o
  "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::top(Node*&)", referenced from:
      _main in ccCoizCT.o
  "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::pop(Node*&)", referenced from:
      _main in ccCoizCT.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

是的,我在 stack.cpp 和 main.cpp 文件中包含了 stack.h

【问题讨论】:

  • 你的模板函数体需要全部在你的头文件中。如果您使用您提到的行修剪这些,您在 .cpp 文件中有模板 主体,它们必须可供编译器执行推导,因此必须在头文件中。
  • 那么我应该在头文件中插入哪些行?
  • 根据您的代码判断,如果有帮助的话,您甚至不应该需要 stack.cpp 文件。将所有 Stack 模板实现移动到您的标题中。
  • 顺便说一句,你的 pop 函数正在泄漏内存。
  • 是的,它现在可以工作了,但是有没有办法可以保留 stack.cpp 文件?

标签: c++


【解决方案1】:

听起来您需要将堆栈的模板定义放回头文件中。模板形成了代码生成计划,因此如果编译器看不到整个模板定义而只看到声明,则不会生成模板特定实例的代码。它将简单地信任该声明并期望在链接时存在一个包含这些模板实例的对象文件。解决方案是 1) 将模板定义保留在头文件中或 2) 预先生成所需的定义,以便链接器可以在链接时找到它们。

请看这里: Template issue causes linker error (C++)

【讨论】:

  • 需要注意的是,将实现移回头文件后,如果错误仍然存​​在,之后再到make cleanmake刷新目标文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2017-02-15
  • 1970-01-01
  • 2015-10-27
  • 2014-05-14
  • 2016-05-31
  • 2016-12-12
相关资源
最近更新 更多