我正在尝试将 Boost::Interprocess 用于共享内存。但是,我的程序还需要使用LLVM,而LLVM需要fno-rtti,而Boost::Interprocess需要RTTI。具体来说,我尝试了第一个例子 here ,我得到了编译错误:
/usr/include/boost/interprocess/detail/in_place_interface.hpp:50:71: error: cannot use typeid with -fno-rtti : in_place_interface(::boost::alignment_of::value, sizeof(T), typeid(T).name())
我的解决方案是浏览 Boost::Interprocess header 并将每个 typeid().name()
替换为字符串常量 "sometype"
。该示例现在编译并运行良好(据我所知)。我不太了解的印象是 Boost::Interprocess 使用类型名称来索引 map ,作为 boost 查找的优化。在我不太了解的印象下,将所有类型名称更改为常量会降低性能,但不会影响正确性。
如果我不从 Boost::Interprocess 中删除 RTTI,我将被迫使用其他一些进程间库,因为 this page对于混合 RTTI 和非 RTTI,我没有太大希望。
这是通过用常量字符串替换 typeid
来替换 Boost::Interprocess header 中的 RTTI,好吗?我担心不正确的行为,例如 Boost 使用 typeid 来确定调用哪个析构函数,或其他此类问题。我在一个单一开发者、单一用途的虚拟机上。
最佳答案
我遇到了同样的问题。我最终通过使用 LLVM_ENABLE_RTTI=ON 重新编译 LLVM 解决了这个问题。
关于c++ - 从 Boost::Interprocess 中删除 RTTI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31736060/