【发布时间】:2017-07-24 21:22:35
【问题描述】:
我在使用 libstdc++ 的 std::any 实现和 mingw 跨越共享库边界时偶然发现了一个问题。它会产生一个std::bad_any_cast,它显然不应该(我相信)。
我使用 mingw-w64、gcc-7 并使用 -std=c++1z 编译代码。
简化代码:
main.cpp:
#include <any>
#include <string>
// prototype from lib.cpp
void do_stuff_with_any(const std::any& obj);
int main()
{
do_stuff_with_any(std::string{"Hello World"});
}
lib.cpp:
将被编译成一个共享库并与 main.cpp 中的可执行文件链接。
#include <any>
#include <iostream>
void do_stuff_with_any(const std::any& obj)
{
std::cout << std::any_cast<const std::string&>(obj) << "\n";
}
这会触发 std::bad_any_cast 尽管传递给 do_stuff_with_any 的 any 确实包含一个字符串。我深入研究了 gcc 的 any 实现,它似乎使用了静态内联成员函数(根据存储对象的类型从模板结构中选择的管理器)地址的比较来检查 any 是否包含请求类型的对象.
而且这个函数的地址似乎跨越了共享库的边界。
std::any 不能保证跨共享库边界工作吗?此代码是否会在某处触发 UB?或者这是 gcc 实现中的错误?我很确定它可以在 linux 上运行,所以这只是 mingw 中的一个错误吗?是已知的还是应该在某处报告?关于(临时)解决方法的任何想法?
【问题讨论】:
-
相关,可能是答案:stackoverflow.com/q/44468900/2069064
-
链接的答案说,当简单地链接共享库时(我没有使用 dlopen 或类似的),不需要额外的步骤。这里似乎不是这样。
-
@Barry 这是不同的。 softwareengineering.stackexchange.com/a/176690/102229关于封面吗?
-
是的,似乎这就是问题所在。谢谢
标签: c++ shared-libraries mingw std c++17