【问题标题】:Undefined reference to std::nothrow in libsupc++.a of newlibnewlib 的 libsupc++.a 中对 std::nothrow 的未定义引用
【发布时间】:2020-04-03 17:29:41
【问题描述】:

现在我正在尝试使用 arm-none-eabi 工具链将 Nuttx 与 libc++ 交叉编译。大多数情况都很好,但是一些 C++ 应用程序对std::nothrow 有未定义的引用。我发现std::nothrow似乎是在工具链的libsupc++.a中定义的:

new_handler.o:
00000000 b (anonymous namespace)::__new_handler
00000000 T std::get_new_handler()
00000000 T std::set_new_handler(void (*)())
00000000 R std::nothrow

我确保libsupc++.a 已链接到我的应用。 我的应用引用std::nothrow 如下:

U nothrow

我猜未定义的引用是由于这些名称不匹配而发生的,一个有命名空间,另一个没有命名空间。 如何解决此命名空间不匹配问题?

以下是我的链接命令行:

arm-none-eabi-ld --entry=__start -nostartfiles -nodefaultlibs -g -Map=/usr/src/uros_ws/firmware/spresense/sdk/nuttx.map --cref --defsym __stack=_vectors+1572864 -T/usr/src/uros_ws/firmware/spresense/sdk/bsp/scripts/ramconfig.ld -L"/usr/src/uros_ws/firmware/spresense/sdk/lib" -L"/usr/src/uros_ws/firmware/spresense/sdk/bsp/board"  -L"/usr/src/uros_ws/firmware/spresense/sdk/bsp" \
-o "/usr/src/uros_ws/firmware/spresense/sdk/nuttx"   \
--start-group -lbsp -lsystem -lextdrivers -llte -lexamples -lapps -lsched -ldrivers -lconfigs -lc -lmm -larch -lcxx -lapps -lnet -lfs -lbinfmt -lgraphics -lnx -lcxx -lboard "/usr/local/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libm.a"  -lsupc++ "/usr/local/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v7e-m/fpv4-sp/hard/libgcc.a" --end-group

【问题讨论】:

  • 你为什么链接ld而不是g++?使用 g++ 将添加所有必需的 c++ 标准库

标签: c++ arm newlib nothrow


【解决方案1】:

您必须在应用中重命名引用 nothrow 的方式。 .a 文件是一个已经编译的库,因此除非您能够修改它并再次编译它,否则它是不可修改的(因此有符号和引用)。

编译器使用命名空间创建唯一引用(name mangling,查看此示例https://godbolt.org/z/cPkvxm)。所以你必须使用std::nothrow(使用它定义的命名空间),否则,你正在调用另一个(可能是未定义的)符号。

如果nothrow 不包含命名空间,您可以像现在一样使用它,但是,如果将来您决定创建自己的nothrown,就会发生冲突(很容易解决,但需要时间和诸如 nothrownCustom/Customnothrown/nothrown_custom/etc 而不是 Custom::nothrown)。

PD:为整个文件使用命名空间是一个非常简单的解决方法,但在这样做之前请先看看这篇文章:Why is "using namespace std;" considered bad practice?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-29
    • 2013-07-03
    • 1970-01-01
    • 2011-12-04
    • 2014-04-11
    • 2012-09-28
    相关资源
    最近更新 更多