Date: prev next · Thread: first prev next last
2012 Archives by date, by thread · List index



 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@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@suse.cz

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.