【问题标题】:Compiler/linker error "undefined reference"编译器/链接器错误“未定义的引用”
【发布时间】:2012-10-16 06:16:35
【问题描述】:

您好,我刚开始学习 C++。我为傻瓜书买了这本大的 C++ 书,并且一直在阅读它。到目前为止它真的很有趣,但现在我被困住了。我一直在谷歌搜索这个问题,但无济于事。我正在使用我正在使用带有 GNU GCC 的代码块 10.05。

我不断收到一条错误消息:

In function 'main':
undefined reference to 'SafeCracker(int)'

代码并不复杂。我是新手,非常沮丧。我不想跳过这部分;我想知道发生了什么事。

主要:

#include <iostream>
#include "safestuff.h"

using namespace std;

int main()
{
  cout << "Surprise, surprise!" << endl;
  cout << "The combination is (once again)" << endl;
  cout << SafeCracker(12) << endl;
  return 0;
}

功能:

#include <iostream>

using namespace std;

string SafeCracker(int SafeID)
{
    return "13-26-16";
}

标题:

using namespace std;

#ifndef SAFESTUFF_H_INCLUDED
#define SAFESTUFF_H_INCLUDED

 string SafeCracker(int SafeID);

#endif // SAFESTUFF_H_INCLUDED

【问题讨论】:

  • 你不知道你不是什么?你不是太空总裁,这是一回事。您也没有将所有文件链接在一起。
  • 向我们展示你是如何构建它的——你的链接阶段出了点问题。
  • 该错误信息意味着编译器无法找到SafeCracker 的定义(即函数的实际代码)。您是否已将包含该函数的文件添加到您的代码块项目中?
  • 它是代码块项目的一部分。我真的不知道它是如何构建的,代码块一直在处理那部分。我需要在编译器设置中做些什么吗?
  • 附带说明,您使用的是字符串数据类型,但不包括字符串类。您应该将“#include ”(不带引号)放在“#include ”的上方或下方。一些编译器在检测到缺少头文件时会自动为您包含头文件,但这不是标准,因此不应依赖它。

标签: c++ linker-errors codeblocks


【解决方案1】:

您没有编译与第一个文件一起列出的第二个文件。尝试直接用 gcc 编译来理解这一点。

假设您的文件已命名:

  • main.cpp
  • SafeCracker.cpp
  • safestuff.h

这就是你正在做的事情

gcc main.cpp

虽然你应该这样做

gcc main.cpp SafeCracker.cpp

此外,为了清楚起见,SafeCracker.cpp 也应该包含头文件。有什么理由让他们分开吗?

另一方面,看到 Daniel Hu 的回答,&lt;iostream&gt; 会自动为您包括&lt;string&gt;。您不应依赖此功能,而应在每个使用字符串的文件中包含 &lt;string&gt;

(来自下面的评论) 您可能正在尝试将 main.cpp 构建为独立文件。这将使 SafeCracker.cpp 未编译。您需要在 Codeblocks 中创建一个项目并将所有三个文件添加到其中(*.cpp 文件和 *.h 文件)。

【讨论】:

  • 没有充分的理由为什么我会按照我所表现出的诚实行事。我不完全确定如何直接编译我将不得不研究一下
  • 好的。好吧,它可能会以此为基础。我的意思是你的教程。你在什么操作系统上运行?您可以将我给您的命令键入终端/控制台窗口(当您与代码位于同一目录中时)以运行它们。 Codeblocks 也只是运行这些命令,最好了解它在 ide 的幕后是如何工作的。
  • 我使用的是 Windows 7 64 位家庭高级版
  • 您可能正在尝试将 main.cpp 构建为独立文件。这将使 SafeCracker.cpp 未编译。您需要在 Codeblocks 中创建一个项目并将所有三个文件添加到其中(*.cpp 文件和 *.h 文件)。
  • 天哪,它做到了。我在项目中创建了它们,但我想它们没有被添加。我真的需要研究 C::B 的背景工作。谢谢你这一切让我发疯了。
【解决方案2】:

我想是因为你没有#include &lt;string&gt;

C++ 必须导入字符串库才能使用字符串,否则一切都被视为 char 数组。

【讨论】:

  • @jett -- 永远不要依赖它。 #include 你用什么。此外,SafeCracker.cpp 不应该包含 iostream,原因很简单,因为该文件没有使用 iostream。不要#include你不使用的东西。该文件定义了函数SafeCracker。该函数在某些标头中声明为返回std::string。不是指针,不是引用。只需std::string。该标头是 #include &lt;string&gt; 所属的位置。
  • @DavidHammen 我同意你应该包括你使用的东西。我在上面的回答中提到了这一点。我只是说这不是问题的解决方案。
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2013-04-04
  • 1970-01-01
  • 2012-11-22
  • 2022-01-01
相关资源
最近更新 更多