Boost logo

Boost :

Subject: Re: [boost] [serialization] Linker errors in trunk
From: Hartmut Kaiser (hartmut.kaiser_at_[hidden])
Date: 2009-08-28 18:43:55


> Sorry, resending as it ended up on the wrong list...
>
> -----------------------------
>
> Since the latest changes in trunk I'm seeing linker errors while
> linking with the serialization library (VS2005 SP1,
> boost_serialization-vc80-mt-gd-1_40.lib):
>
> runtime_support.obj : error LNK2001: unresolved external symbol
> "__declspec(dllimport) public: __thiscall
> boost::archive::archive_exception::archive_exception(enum
> boost::archive::archive_exception::_exception_code,char const *,char
> const *)"
> (__imp_??0archive_exception_at_archive@boost@@QAE_at_W4_exception_code_at_012@PB
> D1_at_Z)
>
> (note the leading underscore in _exception_code)
>
> Which is really strange as this symbol is the only missing one.
>
> OTOH, the library exports the symbol:
>
> boost::archive::archive_exception::archive_exception(
> enum boost::archive::archive_exception::exception_code,
> char const *,char const *);
>
> (note the missing underscore in exception_code)
>
> If I change the first parameter of the archive_exception constructor to
> be a 'int' everything builds fine.

Ok, I solved it. The MS header file excpt.h has a

   #define exception_code _exception_code

which leads to problems if not consistently included. Doh! What a mess.

The bottom line is, that archive_exception.cpp needs to be compiled with
exactly the same windows headers included (excpt.h gets included by
windows.h) as any sources including archive_exception.hpp, which is
generally not possible to ensure.

The only fail-proof way I could see is to always have

#if defined(BOOST_WINDOWS)
#include <excpt.h>
#endif

inside archive_exception.hpp, globally mapping exception_code to
_exception_code. Patch attached.
Ok to commit?

Regards Hartmut




Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk