【问题标题】:Undefined reference to operator new未定义对 operator new 的引用
【发布时间】:2011-04-13 17:50:08
【问题描述】:

我正在尝试使用 cpputest 构建一个简单的单元测试可执行文件。我已经将 cpputest 框架构建到一个静态库中,现在正试图将它链接到一个可执行文件中。但是,由于相关代码,我被绑定到一个相当复杂的 Makefile 设置中。

这是我的命令行:

/usr/bin/qcc -V4.2.4,gcc_ntoarmle_acpp-ne -lang-c++ -O2 -g -g -o Application/UnitTests/Tests/symbols/UnitTestExe -Wl,--start-group Application/UnitTests/Tests/../.objs/main.o Application/UnitTests/lib/libcpputest.a -Wl,--end-group -lm 

我遇到了很多类似以下的错误:

 Application/UnitTests/lib/libcpputest.a(CommandLineTestRunner.o): In function `CommandLineTestRunner::parseArguments(TestPlugin*)':
   Application/UnitTests/cpputest/src/CppUTest/.objs/../CommandLineTestRunner.cpp:114: undefined reference to `operator new(unsigned int, char const*, int)'

我不知道是什么原因造成的。我不是用 C++ 免费获得 operator new 吗?

【问题讨论】:

  • 根据这些信息真的很难提供帮助。尝试减少重现问题所需的条件。上面的命令行太复杂了,即使我们假设代码很简单并且没有做诸如重新定义operator new之类的事情。
  • 第一个错误是不是报了operator new错误?如果不是,第一个报告的错误是什么?
  • 是的,报告的唯一错误是操作员新错误。显示的是第一个。
  • 我看到未定义引用错误的情况,通常意味着不正确的链接和未提供安装库的正确路径。
  • 已编辑以从命令行中删除不必要的元素。

标签: c++ gcc linker cpputest


【解决方案1】:

您可能需要链接到 C++ 支持运行时库。这在您调用 g++ 时会自动发生。在 Linux 上,这是通过将 -lstdc++ 标志添加到链接器来实现的。你必须弄清楚如何在你的平台上做同样的事情。

【讨论】:

    【解决方案2】:

    也许您调用的是 C 编译器 gcc,而不是 C++ 编译器 g++

    【讨论】:

      【解决方案3】:

      您的问题中的信息很少,但看起来某些代码使用了某种形式的placement new,而那个特殊的operator new声明的(编译器找到它并使用它编译代码),链接器找不到它的定义

      (因为我的这个旧答案似乎仍然受到关注:请参阅 here 以获得关于声明与定义的广泛讨论。)

      【讨论】:

      • 我不确定要添加哪些其他信息。代码非常简单;它没有重新定义“新”,所以我不明白为什么链接器无法从标准库中找到它。
      • @mbyrne215:您可以添加最简单的代码来重现这一点。错误消息清楚地提到了operator new(unsigned int, char const*, int)(从CommandLineTestRunner::parseArguments(TestPlugin*) 调用),这显然不是该运算符的标准版本。
      • 你是对的;我很想知道为什么标准库不起作用,我没有仔细查看 3rd 方库。它正在秘密地重新定义新的。我删除了那部分,一切都很好。谢谢。
      【解决方案4】:

      您需要从头开始重建代码,包括库。我收到此错误是因为我无意中将在另一台机器上编译的目标文件(以及其余的源代码)复制到了我的机器上。这很可能会干扰链接步骤,因为现在有两种类型的目标文件,本地(用于修改的源文件)和非本地(所有其他)。我在这里猜测,但是运算符“new”在不同架构上的含义略有不同,这就是您收到此错误的原因。

      附言我知道这对于一个有用的答案来说为时已晚,但我仍然将其发布为记录。

      【讨论】:

      • 在我的例子中,有一些 .o 文件,来自我的前任,在 make clean 后留下,一切都像魅力一样工作
      【解决方案5】:

      对于 QNX 6.5.0,我为 qcc (gcc) 指定了标志 -lang-c++ 以避免错误。

      【讨论】:

        【解决方案6】:

        和原来的帖子一样,在我的例子中,这个错误是在尝试使用 CppUTest 框架链接软件时发生的。

        就我而言,问题的根源似乎与我禁用了 CppUTest 的 MEMORY_LEAK_DETECTION 编译选项有关。我再次启用它,解决了问题。

        【讨论】:

          猜你喜欢
          • 2018-03-31
          • 1970-01-01
          • 2011-10-05
          • 2021-04-20
          • 1970-01-01
          • 2021-04-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多