Exporting templates on Windows (Re: [Libreoffice-commits] .: 7 commits - clucene/patches clucene/source configure.in cppuhelper/inc hwpfilter/source sal/inc solenv/gbuild vbahelper/inc)
Lubos Lunak
l.lunak at suse.cz
Mon Mar 12 07:09:24 PDT 2012
Windows/MSVC experts
On Monday 12 of March 2012, Stephan Bergmann wrote:
> On 03/10/2012 04:39 PM, Lubos Lunak wrote:
> > commit 34f8495dd948e2ad9d64c2c19110e69840cefd1a
> > Author: Luboš Luňák<l.lunak at suse.cz>
> > Date: Sat Mar 10 15:37:02 2012 +0100
> >
> > exported templates need to be marked as such
> >
> > Otherwise their instances created in other modules may end up
> > as non-exported even when used by something exported.
> >
> > diff --git a/cppuhelper/inc/cppuhelper/compbase.hxx
> > b/cppuhelper/inc/cppuhelper/compbase.hxx index 60e99ee..e590412 100644
> > --- a/cppuhelper/inc/cppuhelper/compbase.hxx
> > +++ b/cppuhelper/inc/cppuhelper/compbase.hxx
> > @@ -41,7 +41,7 @@
> > namespace cppu \
> > { \
> > template< __CLASS_IFC##N> \
> > -class SAL_NO_VTABLE WeakComponentImplHelper##N \
> > +class SAL_NO_VTABLE CPPUHELPER_DLLPUBLIC WeakComponentImplHelper##N \
> >
> > : public ::cppu::WeakComponentImplHelperBase \
> >
> > , public ImplHelperBase##N< __IFC##N> \
> > { \
>
> Does this workaround for <http://llvm.org/bugs/show_bug.cgi?id=10113>
> (where I'm still not convinced it is a user error vs. a compiler error)
I am rather convinced that the original issue
(without -fvisibility-inlines-hidden) is a user error, so I consider this to
be a proper fix rather than a workaround.
Imagine for example that the template has a static data member - that one
would need to be merged to be just in one place, and that just wouldn't work
if the template was public API but hidden. So in general I think templates
need to be exported (also look e.g. at STL headers, which export the entire
std namespace, although I can see that Qt templates don't).
> work well with MSVC? I wonder because there all consumers of the
> template (outside of cppuhelper) will see it as __declspec(dllimport),
> and (as long as there is no instantiation in cppuhelper) there is no
> place that would emit it as __declspec(dllexport).
I don't know about MSVC. Meaning that I haven't tried and I don't know how
export/import works on Windows anyway.
But it doesn't make much sense to me. It is not actually the template itself
that is or is not exported, because that's just a compile-time concept, but
it's instances of it as binary concept that are exported. And how does
something know whether some other library does or does not contain Foo< int >
without actually looking?
Assuming that this commit really breaks it on MSVC and the proper change
there is to remove the DLLPUBLIC from the template and hope the compiler and
linker sort it out somehow, then I guess we'll need to add
SAL_TEMPLATE_DLLPUBLIC which does nothing with MSVC and the right thing with
gcc/clang.
MSDN article on the dllimport/dllexport flags feels like it doesn't actually
say anything, but reading http://support.microsoft.com/kb/132044/en-us makes
me think the flags are just optimizations, so nothing will break. But
according to it SAL_TEMPLATE_DLLPUBLIC would be the right thing.
Windows/MSVC experts, any ideas/opinions?
--
Lubos Lunak
l.lunak at suse.cz
More information about the LibreOffice
mailing list