On Mon, May 23, 2011 at 10:51 AM, Sanatan Rai <span dir="ltr">&lt;<a href="mailto:sanatan@gmail.com">sanatan@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On 23 May 2011 15:11, Michael Wild &lt;<a href="mailto:themiwi@gmail.com">themiwi@gmail.com</a>&gt; wrote:<br>
&gt;&gt;&gt; Yes, but you are registering the concrete factories implicitly instead<br>
&gt;&gt;&gt; of explicitly, which is causing you the trouble you experience.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Better have your user provide a function registering his/her classes<br>
&gt;&gt;&gt; explicitly.<br>
&gt;&gt;<br>
&gt;&gt; I guess this is getting to be off topic, but indeed the<br>
&gt;&gt; anonymous namespace trick is supposed to do exactly that.<br>
</div>&lt;snipped&gt;<br>
<div class="im">&gt;&gt; libraries that this problem occurs. I haven&#39;t seen a solution to this<br>
&gt;&gt; problem either in books or via google.<br>
&gt;&gt;<br>
&gt;&gt; --Sanatan<br>
&gt;<br>
&gt; The problem is, that when you link a static library to another binary<br>
&gt; (be it shared library or executable) only the *required* symbols are<br>
&gt; used, all others get discarded. Since nothing in your code actually<br>
&gt; references those global instances in the anonymous namespace (the linker<br>
&gt; doesn&#39;t care about that, BTW), they are ignored.<br>
&gt;<br>
&gt; Four solutions:<br>
&gt;<br>
&gt; 1. Only do monolithic builds.<br>
&gt; 2. Use shared libraries/DLLs<br>
&gt; 3. Use --whole-archive or similar and hack your way through MSVC (I did<br>
&gt; it once. It was ugly. Very ugly. See<br>
&gt; <a href="https://github.com/themiwi/cppcheck/tree/227378f763d50b005b7dd2167e2cef791054a30c" target="_blank">https://github.com/themiwi/cppcheck/tree/227378f763d50b005b7dd2167e2cef791054a30c</a>.<br>
&gt; Especially lib/CMakeLists.txt and lib/generateStaticLinkFlags.cmake. I<br>
&gt; replaced it with an explicit registration scheme now...)<br>
&gt; 4. Use an explicit registration scheme.<br>
&gt;<br>
&gt; For sanity&#39;s sake, go with 4.<br>
<br>
</div>   Ok: you&#39;ve lost me here. Are you saying a trick like:<br>
<br>
   namespace {<br>
     helper1 *createHelper1() { return (new Helper1());}<br>
     const bool isRegistered =<br>
factory::instance().registerHelper(&quot;helper1&quot;, createHelper1);<br>
}<br>
isn&#39;t explicit?<br></blockquote><div><br></div><div>That&#39;s correct. It&#39;s not explicit. Because if nothing references the bool variable &quot;isRegistered&quot; then the linker is free to (possibly) throw away it&#39;s initialization because it&#39;s not referenced. This code may work with some compilers; but it is not guaranteed to work.</div>
<div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
I could do the following: create a global object in the cpp, that<br>
belongs to a type that would<br>
do the registration. Would you regard this also as implicit?<br>
<br>
The problem with either of these approaches is the same: if the code<br>
lives in a separate library<br>
that is loaded only when needed, then these registrations don&#39;t take<br>
place. So the framework doesn&#39;t<br>
know that the objects can be available.<br>
<br>
Apologies for seeming obtuse but I don&#39;t follow what you mean by<br>
`explicit registration&#39; here.<br></blockquote><div><br></div><div>Explicit registration is having a method as mentioned earlier, something like &quot;RegisterKnownFactories&quot; and then asking clients to make sure they call that method first before calling anything that requires a factory to create something.</div>
<div><br></div><div>HTH,</div><div>David</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font color="#888888"><br>
--Sanatan<br>
</font><div><div></div><div class="h5">_______________________________________________<br>
Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Please keep messages on-topic and check the CMake FAQ at: <a href="http://www.cmake.org/Wiki/CMake_FAQ" target="_blank">http://www.cmake.org/Wiki/CMake_FAQ</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://www.cmake.org/mailman/listinfo/cmake" target="_blank">http://www.cmake.org/mailman/listinfo/cmake</a><br>
</div></div></blockquote></div><br>