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)

Michael Stahl mstahl at redhat.com
Mon Mar 12 07:29:40 PDT 2012

On 12/03/12 15:09, Lubos Lunak wrote:
>  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?

applying logic to how C++ features interact with linkers on various
platforms is generally a futile endeavour.

>  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.

Voreppe tinderbox is already complaining rather loudly...

>  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.

i recommend the following to understand the mess you got yourself into
(link to archive.org because original has been purged):


More information about the LibreOffice mailing list