Я отлаживал вещи в Linux, хорошие новости:
Вы столкнулись с bullet no. 3 из поста Джереми Пак :
RTTI не всегда работает должным образом через границы DLL. Проверьте классы type_info, чтобы увидеть, как я справляюсь с этим.
У меня есть крошечный обходной путь (ниже) до boost/extension/impl/typeinfo.hpp
(но вам действительно нужно поговорить с разработчиком Boost Extension). , а не полагаются на встроенное сравнение для RTTI typeinfo.
Глядя на typeinfo.hpp, кажется, что Windows на самом деле никогда не использует сравнение typeinfo, поэтому я решил протестировать с помощью резервного метода 'strcmp' и вуаля:
$ LD_LIBRARY_PATH=. ./Simple-Inheritance
Creating an animal using factory: Cougar factory
Created an animal: cougar Age: 2
Creating an animal using factory: Leopard factory
Created an animal: leopard Age: 3
Creating an animal using factory: Puma factory
Created an animal: puma Age: 4
Creating an animal using factory: Wildcat factory
Created an animal: wildcat Age: 5
В частности, я могу показать, что поиск типа из convertible_
завершается неудачно в type_map.hpp, строка 68;
- Когда это преобразование вызывается из самого расширения dll, преобразование успешно находит совпадение, используя RTTI.
- Однако, когда ' same ' .get () выполняется из тестового приложения (через границы DLL, то есть), RTTI отличается, и такое совпадение не найдено, и строки 74/75 являются хит:
.
73 if (it == instances_.end()) {
74 holder = new type_holder<StoredType>;
75 it = instances_.insert(std::make_pair(t, holder)).first;
76 }
Patch
diff --git a/Boost.Extension.Tutorial/libs/boost/extension/impl/typeinfo.hpp b/Boost.Extension.Tutorial/libs/boost/extension/impl/typeinfo.hpp
index 843fed2..09fc353 100644
--- a/Boost.Extension.Tutorial/libs/boost/extension/impl/typeinfo.hpp
+++ b/Boost.Extension.Tutorial/libs/boost/extension/impl/typeinfo.hpp
@@ -50,7 +50,7 @@ struct type_info_handler<default_type_info, ClassType>
// This list should be expanded to all platforms that successfully
// compare type_info across shared library boundaries.
-#if defined(__APPLE__) || defined(__GNUC__) || \
+#if defined(__APPLE__) || \
defined(BOOST_EXTENSION_FORCE_FAST_TYPEINFO)
namespace boost {
namespace extensions {
@@ -90,7 +90,7 @@ inline bool operator>(const default_type_info& first,
} // namespace extensions
} // namespace boost
#else // OTHER OS
-#include <string>
+#include <cstring>
namespace boost { namespace extensions {
inline bool operator<(const default_type_info& first,
const default_type_info& second) {