2010-09-17 56 views
16

我正在尝试使用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++免费获得运算符新的版本吗?

+0

根据这些信息确实很难提供帮助。尝试*减少重现问题所需的条件。上面的命令行太复杂了,即使我们假设代码很简单,并且不执行重新定义'operator new'等操作。 – 2010-09-17 13:43:19

+0

第一个错误是否报告了操作员新错误?如果不是,报告的第一个错误是什么? – 2010-09-17 13:50:28

+0

是的,报告的唯一错误是操作员新错误。显示的那个是第一个。 – mbyrne215 2010-09-17 13:50:57

回答

6

有你的问题,从工作的信息非常少,但它看起来像一些代码使用某种形式的放置新,虽然特殊operator new宣布(编译器发现它和编译代码使用它),接头找不到它的定义

+0

我不确定要添加哪些其他信息。代码非常简单;它并没有重新定义'新',所以我不明白为什么链接器无法从标准库中找到它。 – mbyrne215 2010-09-17 14:02:02

+1

@ mbyrne215:你可以添加最简单的代码来重现这一点。该错误消息清楚地提到了一个'operator new(unsigned int,char const *,int)'(从'CommandLineTestRunner :: parseArguments(TestPlugin *)'调用),显然不是该运算符的标准版本。 – sbi 2010-09-17 14:07:10

+2

你是对的;我很想找到为什么标准库不工作,我没有仔细查看第三方库。这是在暗中重新定义新的。我删除了这部分,一切都很好。谢谢。 – mbyrne215 2010-09-17 14:21:50

46

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

+0

+1,谢谢.. – Oli 2012-12-14 22:50:07

+0

这是解决了我的问题的答案,我的 – yota 2017-10-13 08:58:13

4

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

p.s.我知道这对于一个有用的答案来说太晚了,但我仍然发布这个记录。

+0

在我的情况下,有一些来自我的前任的.o文件,在make clean之后留下,一切都像魅力一样工作 – aldr 2016-04-15 21:15:26

0

也许你打电话给gcc,C编译器代替g++,这是C++编译器。

0

对于QNX 6.5.0,我已指定标记-lang-c++qccgcc)以避免该错误。