Re: [Boost-users] Mixing versions of boost
Why not to introduce an additional level of indirection ;) Just wrap the 3d-Party lib in a DLL (or Shared Object under Linux), than you should be find to use 2 libs with each other...
On Wed, Jun 25, 2008 at 6:41 PM, David Abrahams
wrote: Vladimir Prus wrote: dariomt@gmail.com wrote:
Hi all,
I'm using header-only boost libs in two static libraries that will be linked into an executable.
No boost components are used in the interfaces of those libs, boost is only used in the implementation inside the libraries.
Is it possible to mix versions of boost in those two static libraries? Will the linker complain, or will it just get confused and mess up the executable?
In general, this is highly risky business. On GCC, each static library will contain a copy of every template function used by a static
Thanks for the idea. I'll give it a try, but ideally the application should be distributed as a single executable file. About versioning the boost namespace, I suppose you mean something like changing boost namespace to e.g. boost_1_35_0. Any thoughts on how much work it would take me to patch a given version of boost to do that? Is it even possible? library.
If the linker finds that the same function is used in both static libraries, it will put only one copy in the output executable, and if the definitions of those functions differ, you're in trouble. See the attached example, which, then run, produces:
a.cpp:say a.cpp:say
Which is clearly wrong. This *might* work with shared libraries, but you need to consult your toolchain documentation.
For the past few years we've had a GCC option that allows you to expose from dynamic libs only those names you specify, sort of like declspec on Windows. I don't remember the name of the flag, though.
On Thu, Jun 26, 2008 at 9:35 AM,
About versioning the boost namespace, I suppose you mean something like changing boost namespace to e.g. boost_1_35_0. Any thoughts on how much work it would take me to patch a given version of boost to do that? Is it even possible?
What I mean is: Version 1.34 might have a class A with one field of type int. Version 1.35 might add to the class an additional field. What hapen if 1.34 returns this type's instance to 1.35. And 1.35 will try to access the additional field... 1.34: struct A { int i; }; 1.35 struct A { int i; double d; }; A* get_A_from_134() { ... } void modify_A_from_134_in_135() { get_A_from_134()->d=10.0; //You write to a memory which does not belong to A } This is what I mean. Can crash your soft... Best Thing would be in this case to not return boost class instances over the lib boundaries if you know that these rely on different versions. Best Regards, Ovanes
participants (2)
-
dariomt@gmail.com
-
Ovanes Markarian