Я разрабатываю надстройку Thunderbird, которая использует libedataserver.so.
Аддон использует js-ctypes для вызова e_source_registry_new_sync из вышеуказанной библиотеки. См. ниже код:
var lib = ctypes.open("libedataserver-1.2.so.18");
var GCancellable = {};
GCancellable.cls = new ctypes.StructType("GCancellable");
var GError = {};
GError.cls = new ctypes.StructType("GError");
var ESourceRegistry = {};
ESourceRegistry.cls = new ctypes.StructType("ESourceRegistry");
ESourceRegistry.e_source_registry_new_sync =
lib.declare(
"e_source_registry_new_sync",
ctypes.default_abi,
ESourceRegistry.cls.ptr,
GCancellable.cls.ptr,
GError.cls.ptr.ptr);
//below line causes an error
var sourceRegistry = ESourceRegistry.e_source_registry_new_sync(null, null);
Он отлично работает в Ubuntu, однако в Fedora 21 он печатает ниже вывода и зависает:
(thunderbird:2735): GLib-GObject-WARNING **: cannot register existing type 'EDBusSource'
(thunderbird:2735): GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion 'G_TYPE_IS_INTERFACE (interface_type)' failed
(thunderbird:2735): GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed
(thunderbird:2735): GLib-GObject-WARNING **: invalid cast from 'EDBusSourceProxy' to '<invalid>'
Я использую Fedora 21 с эволюционным сервером данных 3.12.11-1.fc21.
Ubuntu использует сервер эволюции данных 3.12.10.
Я разработал простое приложение на C, которое вызывает e_source_registry_new_sync, и оно прекрасно работает.
Может кто-нибудь подсказать, в чем может быть причина этой проблемы?
@UPDATE: я обнаружил ошибку Fedora. По словам сопровождающих Fedora, проблема вызвана двойной загрузкой libedataserver (мой код и evolution-ews):
Проблема, похоже, заключается в том, что Thunderbird загружает libedataserver-1.2.so.18 сам по себе, в то время как libcamelews.so имеет зависимость во время выполнения от libedataserver-1.2.so, но это (во время выполнения) не удовлетворяется загруженным Thunderbird libedataserver -1.2.so.18, поэтому он загружается снова, что нарушает систему типов GLib.
Пожалуйста, прокомментируйте, если есть что-то, что я могу сделать со стороны аддона.