【发布时间】:2016-03-22 09:28:00
【问题描述】:
在尝试编译我的程序时出现未解决的符号错误,它抱怨找不到__dso_handle。这个函数通常定义在哪个库中?
nm on libstdc++.so.6 的以下结果是否意味着它包含该内容?
我尝试链接它,但仍然出现错误。
nm libstdc++.so.6 | grep dso
00000000002fc480 d __dso_handle
【问题讨论】:
在尝试编译我的程序时出现未解决的符号错误,它抱怨找不到__dso_handle。这个函数通常定义在哪个库中?
nm on libstdc++.so.6 的以下结果是否意味着它包含该内容?
我尝试链接它,但仍然出现错误。
nm libstdc++.so.6 | grep dso
00000000002fc480 d __dso_handle
【问题讨论】:
__dso_handle 是used to identify dynamic shared objects during global destruction 的“守卫”。
实际上,您应该停止阅读此处。如果您试图通过与__dso_handle 混淆来破坏对象识别,那么可能是非常错误的。
但是,既然您问它是在哪里定义的:答案很复杂。要显示其定义的位置(对于 GCC),请在 C++ 文件中使用iostream,然后使用extern int __dso_handle;。由于类型冲突,这应该会显示声明的位置(请参阅this forum thread 获取来源)。
有时是defined manually。
有时,它由编译器安装的“运行时”定义/提供(实际上,CRT 通常只是一堆二进制标头/入口点管理代码,以及一些出口防护/处理程序)。在 GCC 中(不确定其他编译器是否支持这一点;如果支持,它将在他们的源代码中):
__dso_handle replacement/tracker example 1__dso_handle replacement/tracker example 2通常,它是在标准库中定义的:
进一步阅读:
【讨论】:
我遇到了这个问题。以下是似乎可靠地产生问题的条件:
-nostdlib(典型的小型嵌入式场景)。std::vector。以前这是std::array 静态分配的,没有任何问题。显然并非所有std:: 静态分配的对象都会导致问题。如果这是您的用例,那么只需将命令行选项添加到您的编译/链接命令行:-fno-use-cxa-atexit
这是__dso_handle usage as 'handle to dynamic shared object' 的一个很好的链接。
页面中似乎有错字,但我不知道该联系谁来确认:
在你调用了对象的构造函数和析构函数之后,GCC 会自动调用函数...
我认为这应该是“一旦调用了所有析构函数,GCC 就会调用函数”......
确认这一点的一种方法是实现前面提到的__cxa_atexit 函数,然后单步执行程序并查看它被调用的位置。这几天我会试试,但不是现在。
【讨论】:
添加到@natersoz 的答案-
对我来说,使用 -Wabi-tag -D_GLIBCXX_USE_CXX11_ABI=0 和 -fno-use-cxa-atexit 有助于编译旧的库。一个迹象是错误消息中的 C++ 函数是否由于 ABI change 而在其中包含 std::__cxx11。
【讨论】: