libtool
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: different flags for static and shared


From: David Byron
Subject: RE: different flags for static and shared
Date: Mon, 17 Aug 2009 10:25:55 -0700

> >      #if BUILDING_LIBFOO && HAVE_VISIBILITY
> >      #define LIBFOO_DLL_EXPORTED
__attribute__((__visibility__("default")))
> >      #elif BUILDING_LIBFOO && defined _MSC_VER
> >      #define LIBFOO_DLL_EXPORTED __declspec(dllexport)
> >      #elif defined _MSC_VER
> >      #define LIBFOO_DLL_EXPORTED __declspec(dllimport)
> >      #else
> >      #define LIBFOO_DLL_EXPORTED
> >      #endif
> >
> > Trouble is, this doesn't handle the case where I'm
> > building a static lib using MS tools.  In that case I
> > (think I) want the macro to be empty.
>
> libtool should be adding -DPIC only for the non-static
> objects, that should allow you to distinguish between that
> and the objects that are used for the DLL.

Having LIBFOO_DLL_EXPORTED depend on whether PIC is defined works for
building libfoo itself -- the shared library have exports decorated with
__declspec(dllexport) and for the static library, LIBFOO_DLL_EXPORTED is
empty.  My macros look like this now:

#if BUILDING_LIBFOO && HAVE_VISIBILITY
#  define LIBFOO_DLL_EXPORTED  __attribute__((__visibility__("default")))
#elif defined _MSC_VER
#  if BUILDING_LIBFOO && defined(PIC)
#    define LIBFOO_DLL_EXPORTED __declspec(dllexport)
#  elif !defined(BUILDING_LIBFOO)
#    define LIBFOO_DLL_EXPORTED __declspec(dllimport)
#  else
#    define LIBFOO_DLL_EXPORTED
#  endif
#else
#  define LIBFOO_DLL_EXPORTED
#endif

For the _MSC_VER case, I read the three alternatives like this:

1. If building a shared version of libfoo: __declspec(dllexport)
2. else if using libfoo (shared or static): __declspec(dllimport)
3. else (i.e. building a static version of utils): nothing

but it turns out this is insufficient.  #1 and #3 are correct, but to make
LIBFOO_DLL_EXPORTED correct all the time I need to split #2 into separate
cases.  __declspec(dllimport) is correct when using a shared libfoo, but
when using a static libfoo, I need LIBFOO_DLL_EXPORTED to be empty.  I'm
loving M$ at the moment.

One way to resolve this is to provide some extra (aka project-specific)
option at configure time so users can specify that they want static or
shared.  Then I can use that in my preprocessor logic and pass -all-static
or -static or -static-libtool-libs (haven't figured out which yet) in
blah_LDFLAGS.

Working on this now.  Curious what people think of this, and if there's a
better way that I'm missing (other than ditching MS which unfortunately
isn't an option at the moment).

Thanks.

-DB





reply via email to

[Prev in Thread] Current Thread [Next in Thread]