$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Mark Melton (mark.melton_at_[hidden])
Date: 2006-11-02 18:54:48
All,
I am hoping someone can help me resolve a problem I am having putting  
serialization code into a static library. If I am lucky, it will be  
simple user error.
Here is a quick synopsis of the code:
a.hpp
class A { virtual ~A() { } ...}
b.hpp
class B : public A { virtual ~B() { } ... }
with classes A and B both having the standard serialization functions  
defined in a.cpp and b.cpp respectively along with the necessary  
BOOST_CLASS_EXPORT statements.
Now, compiling a single program like this works fine and the program  
is able to serialize objects of types A and B through pointers of  
type A without any problems. Life is good.
        g++ -o my_prog my_prog.cpp a.cpp b.cpp -lboost_serialization
However, compiling a static library and then linking the same program  
like this produces a my_prog that gets an unregistered_class  
exception when trying to serialize an object of type B through a  
pointer of type A.    Not what I expected because the only difference  
is in the linking phase where code is now coming from the library  
instead of the object files.
        g++ -o a.o -c a.cpp
        g++ -o b.o -c b.cpp
        ar cru a.o b.o libmine.a
        ranlib libmine.a
        g++ -o my_prog my_prog.cpp libmine.a -lboost_serialization
Now, combining a.cpp and b.cpp and building the library produces a  
working program. Confusion reigns.
        g++ -o ab.o -c a.cpp b.cpp
        ar cru ab.o libmine.a
        ranlib libmine.a
        g++ -o my_prog my_prog.cpp libmine.a -lboost_serialization
Any ideas would be greatly appreciated. I have tried several  
incantations, but I cannot make any headway. I am working under the  
assumptions that it has something do to with the initialization code  
difference between using the object files and the library.
I am using boost 1.33.1 on intel OS X 10.4.8 with g++ in 64 bit mode.  
If it would be useful, I can run experiments in 32 bit mode or on  
Ubuntu, but I have yet to find any differences with this issue.
Thanks,
mark