Это копия письма, которое я отправил в список рассылки Luabind.
http://sourceforge.net/mailarchive/message.php?msg_id=27420879
Я не уверен, относится ли это и к Windows, и к DLL, но у меня был похожий
опыт работы с GCC и общими модулями в Linux: зарегистрированные классы
с Luabind, где действует только в этой общей библиотеке, но вызвало
ошибки сегментации, если используются за пределами разделяемой библиотеки.
Решение было исправить патч класса luabind :: type_id и сравнить
использование typeid (T) .name () вместо typeid (T) :: operator =. Для GCC,
причина, по которой оператор typeid может не работать в общих библиотеках
объясняется здесь [1]. В этом конкретном случае я загрузил общий
библиотека с Lua's require (), которая, к сожалению, не проходит
RTLD_GLOBAL, чтобы dlopen.
[1] http://gcc.gnu.org/faq.html#dso
Проблема равенства typeid появилась в других библиотеках C ++, например
в boost :: any [2], с тем же исправлением [3], сравнение typeid (T) .name ().
[2] https://svn.boost.org/trac/boost/ticket/754
[3] https://svn.boost.org/trac/boost/changeset/56168
Может быть, прикрепленный патч поможет и в случае с DLL.
--- include.orig/luabind/typeid.hpp
+++ include/luabind/typeid.hpp
@@ -6,6 +6,7 @@
# define LUABIND_TYPEID_081227_HPP
# include <boost/operators.hpp>
+# include <cstring>
# include <typeinfo>
# include <luabind/detail/primitives.hpp>
@@ -33,17 +34,17 @@
bool operator!=(type_id const& other) const
{
- return *id != *other.id;
+ return std::strcmp(id->name(), other.id->name()) != 0;
}
bool operator==(type_id const& other) const
{
- return *id == *other.id;
+ return std::strcmp(id->name(), other.id->name()) == 0;
}
bool operator<(type_id const& other) const
{
- return id->before(*other.id);
+ return std::strcmp(id->name(), other.id->name()) < 0;
}
char const* name() const