对运算符new的未定义引用

时间:2010-09-17 13:40:43

标签: c++ gcc linker

我正在尝试使用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吗?

6 个答案:

答案 0 :(得分:60)

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

答案 1 :(得分:7)

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

(由于我的这个旧答案似乎仍然受到关注:请参阅here,了解有关声明与定义的广泛讨论。)

答案 2 :(得分:4)

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

P.S。我知道这对于一个有用的答案来说已经太晚了,但我仍然会将其记录在案。

答案 3 :(得分:2)

也许您正在调用NSRunningApplication.current.hide() ,C编译器而不是gcc,这是C ++编译器。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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