gcc 未定义对运算符new的引用

pgky5nke  于 2022-11-13  发布在  其他
关注(0)|答案(7)|浏览(200)

我正在尝试使用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++的new运算符吗?

h9a6wy2h

h9a6wy2h1#

您可能需要链接C++ support运行时库。当您调用g++时,这会自动发生。在Linux上,这是通过向链接器添加-lstdc++标志来实现的。您必须弄清楚如何在您的平台上执行相同的操作。

wgeznvg7

wgeznvg72#

也许您正在调用gcc(C编译器),而不是g++(C++编译器)。

bkkx9g8r

bkkx9g8r3#

您的问题中没有什么信息可供参考,但看起来有些代码使用了某种形式的 placement new,而且虽然这个特殊的operator new是***声明的***(编译器找到它并使用它编译代码),但链接器却找不到它的*定义

  • (因为我的这个老答案似乎仍然得到关注:有关声明与定义的详细讨论,请参见here。)*
9lowa7mx

9lowa7mx4#

您需要从头开始重建代码,包括库。我得到这个错误是因为我无意中复制了在另一台机器上编译的目标文件(与源代码的其余部分)到我的机器。最有可能的是,这干扰了链接步骤,因为现在有两种类型的对象文件,本机(对于修改过的源文件)和非本机(所有其他文件)。我在这里猜测,但是操作符“new”在不同的体系结构上的含义略有不同,这就是为什么你会得到这个错误。
我知道这是一个有用的答案太晚了,但我仍然张贴这一记录。

yi0zb3m4

yi0zb3m45#

对于QNX 6.5.0,我已经为qccgcc)指定了标志-lang-c++,以避免错误。

yshpjwxd

yshpjwxd6#

就像最初的帖子一样,在我的例子中,这个错误发生在试图使用CppUTest框架链接一个软件时。
在我的例子中,问题的根源似乎与我禁用了CppUTest的MEMORY_LEAK_DETECTION编译选项有关。我再次启用了它,这就解决了问题。

vkc1a9a2

vkc1a9a27#

有时候添加**-lstdc++**是不够的。你应该把它添加到正确的位置。例如我有一个这样的列表,不起作用:

target_link_libraries(cfr2 pthread m stdc++ "${CMAKE_SOURCE_DIR}/compressor/libcompressor.a" )

但这一个工作正常:

target_link_libraries(cfr2 pthread m "${CMAKE_SOURCE_DIR}/compressor/libcompressor.a" stdc++)

如果有人在评论区解释一下就好了。

相关问题