
On Thursday, 20. May 2010 17:36:54 you wrote:
Beman Dawes wrote:
We aren't proposing any change to that; I think both Jürgen and I were trying to make fairly minimal changes to current Boost practice and headers.
Right. I wanted to take as small steps as possible and don't risk to break anything.
The #ifdef BOOST_HAS_DECLSPEC surrounds everything, but would be false for GCC, right?
Therefore I replace those checks with BOOST_SYMBOL_EXPORT.
I'd suggest that the BOOST_HAS_DECLSPEC check be managed by the config system so that BOOST_SYMBOL_EXPORT and BOOST_SYMBOL_IMPORT are defined appropriately (compressed into one place here):
#define BOOST_SYMBOL_EXPORT #define BOOST_SYMBOL_IMPORT #define BOOST_SYMBOL_VISIBLE
#ifdef BOOST_HAS_DECLSPEC # undef BOOST_SYMBOL_EXPORT # define BOOST_SYMBOL_EXPORT __declspec(dllexport) # undef BOOST_SYMBOL_IMPORT # define BOOST_SYMBOL_IMPORT __declspec(dllimport) #elif defined BOOST_HAS_VISIBILITY # undef BOOST_SYMBOL_VISIBLE # define BOOST_SYMBOL_VISIBLE __attribute__(visibility("default")) # ifdef BOOST_DEFAULT_VISIBILITY_IS_HIDDEN # undef BOOST_SYMBOL_EXPORT # define BOOST_SYMBOL_EXPORT BOOST_SYMBOL_VISIBLE # endif #endif
BOOST_HAS_VISIBILITY would be undefined for most compilers, but would be defined for GCC (when __GNUC__ is defined, perhaps after some particular release, but I don't know when it was introduced).
I had the same idea, but decided to take small steps. First, get visibility in with a minimal diff, then add support to Boost.Build and then refactor. It is __GNUC_ > 4, by the way ;-))
= 4, but only if using -fvisiblity=hidden. I haven't found a way to detect that, so I guess it has to be assumed or defined via the command
BOOST_DEFAULT_VISIBILITY_IS_HIDDEN must be defined for GCC, when __GNUC__ line.
No. Visibility can always be explicitly specified. So no BOOST_DEFAULT_VISIBILITY_IS_HIDDEN macro is needed. I would simply always #define BOOST_SYMBOL_EXPORT/IMPORT to the correct values.
Then, each library would use this instead:
#define BOOST_WHATEVER_DECL #if defined BOOST_ALL_DYN_LINK || defined BOOST_WHATEVER_DYN_LINK # undef BOOST_WHATEVER_DECL # ifdef BOOST_WHATEVER_SOURCE # define BOOST_WHATEVER_DECL BOOST_SYMBOL_EXPORT # else # define BOOST_WHATEVER_DECL BOOST_SYMBOL_IMPORT # endif #endif
Defining BOOST_WHATEVER_SOURCE in each library source file is rather awkward, but it does work. (I prefer to define that in the build command line via makefile or whatever. You can't forget it then.)
Well, most (all) libraries already have it the source. It is just a matter of taste. And msvc will tell you very fast that you have no exported symbols...
While the change I've shown is pervasive, the result is much simpler and cleaner for each library.
Yes, that is the goal. But I still prefer to do small steps. Yours, Jürgen -- * Dipl.-Math. Jürgen Hunold ! Ingenieurgesellschaft für * voice: ++49 511 262926 57 ! Verkehrs- und Eisenbahnwesen mbH * fax : ++49 511 262926 99 ! Lister Straße 15 * juergen.hunold@ivembh.de ! www.ivembh.de * * Geschäftsführer: ! Sitz des Unternehmens: Hannover * Prof. Dr.-Ing. Thomas Siefer ! Amtsgericht Hannover, HRB 56965 * PD Dr.-Ing. Alfons Radtke !