
Dear Boosters, The use of Boost/Serialization through pointers to objects of an abstract derived class across several DLLs has been addressed a couple of times so far in this list. Some very useful comments have been added in the doc by Robert, particularly concerning the "export/registration" mechanism. After investigation and careful reading of the docs and using some comments from this list, I now have what I consider as a minimal use case implementing: - a DLL `A' with an abstract 'base' class and some inherited classes, all serializable. - a DLL `B' with more inherited serializable class. The purpose of this exercise is to demonstrate that it is possible to pre-build serialization code across several DLLs and not only in the executable unit (which is already known to work well). I really need such a system for my project(s) but it is clear from users' requests on the list that other people would like to benefit of such an approach. Basically, the bits attached in the zip file work (under Linux/gcc, 4.X and Boost 1.44) BUT there is still one problem: one of the sample executable badly segfaults while terminating, probably at some singleton termination (however it is just a feeling). Here is a GDB dump:
from /scratch/sw/boost/install-1_44_0-Linux-i686-gcc45/lib/libboost_serialization.so.1.44.0 #6 0x001aac6b in boost::serialization::void_cast_detail::void_caster_primitive<A::c1, A::base>::~void_caster_primitive() () from ./lib/libA.so #7 0x001aaced in boost::serialization::detail::singleton_wrapper<boost::serialization::void_cast_detail::void_caster_primitive<A::c1, A::base> >::~singleton_wrapper() () from ./lib/libA.so #8 0x00389e14 in __cxa_finalize () from /lib/i386-linux-gnu/libc.so.6 #9 0x001a02b4 in __do_global_dtors_aux () from ./lib/libA.so #10 0x001adab0 in _fini () from ./lib/libA.so #11 0x0011ec3d in ?? () from /lib/ld-linux.so.2 #12 0x00389a6f in ?? () from /lib/i386-linux-gnu/libc.so.6 #13 0x00389acf in exit () from /lib/i386-linux-gnu/libc.so.6 #14 0x00370e3f in __libc_start_main () from /lib/i386-linux-gnu/libc.so.6 #15 0x08048b41 in _start () <<<
The funny thing (however likely relevant) is that this program does NOT use serialization; it is just linked against DLLs with embedded serialization code. It encounters some kind of side-effect. All the executable that use serialization code from both DLLs work fine and we get the proper serialization/deserialization actions. Also this problem does not occur when the inheritance scheme of serializable class has only one level (see README in the zip file). As it is a rather complex problem which turns to be only demonstrated given a full multi-DLLs skeleton package, the attached ZIP provides all the source code and a README file that explains how the DLLs are designed and used. There are build instructions and scripts too (for Linux). I hope some of you will find a little time to explore this use case (the code is very simple) and will be able to propose a solution or at least some hint to fix this problem. Thanks a lot. Regards frc -- François Mauger Groupe "Interactions Fondamentales et Nature du Neutrino" NEMO-3/SuperNEMO Collaboration LPC Caen-CNRS/IN2P3-UCBN-ENSICAEN Département de Physique -- Université de Caen Basse-Normandie Adresse/address: Laboratoire de Physique Corpusculaire de Caen (UMR 6534) ENSICAEN 6, Boulevard du Marechal Juin 14050 CAEN Cedex FRANCE Courriel/e-mail: mauger@lpccaen.in2p3.fr Tél./phone: 02 31 45 25 12 / (+33) 2 31 45 25 12 Fax: 02 31 45 25 49 / (+33) 2 31 45 25 49