<div dir="ltr">On Mon, Jul 21, 2008 at 5:21 AM, Stephan Maximilian Huber <<a href="mailto:ratzfatz@digitalmind.de" target="_blank">ratzfatz@digitalmind.de</a>> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Christiansen, Brad schrieb:<div><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi,<br>
<br>
I have searched the archive but cant find any mention of the problem,<br>
though I think can remember reading about a solution some time ago on<br>
the list.<br>
<br>
I have just tried to build the static version of OSG v2.4 and v2.5.5<br>
using ViualStudio .Net 2003. When I do this build I get 5000+ warnings<br>
about dulpicate definitions when linking (LNK 4006). I then cannot link<br>
my aplication against the resulting .libs. Has anyone else encountered<br>
this problem and have a fix / workaround?<br>
</blockquote></div>
Are these link-errors related to OpenThreads? A quick and dirty fiy would be:<br>
<br>
change CMakeLists for all osg-libs/src from<br>
<br>
IF   (DYNAMIC_OPENSCENEGRAPH)<br>
   ADD_DEFINITIONS(-DOSG_LIBRARY)<br>
ELSE (DYNAMIC_OPENSCENEGRAPH)<br>
   ADD_DEFINITIONS(-DOSG_LIBRARY_STATIC)<br>
ENDIF(DYNAMIC_OPENSCENEGRAPH)<br>
<br>
<br>
to<br>
<br>
IF   (DYNAMIC_OPENSCENEGRAPH)<br>
   ADD_DEFINITIONS(-DOSG_LIBRARY)<br>
ELSE (DYNAMIC_OPENSCENEGRAPH)<br>
   ADD_DEFINITIONS(-DOSG_LIBRARY_STATIC)<br>
   ADD_DEFINITIONS(-DOT_LIBRARY_STATIC)<br>
ENDIF(DYNAMIC_OPENSCENEGRAPH)<br>
<br>
<br>
The underlying problem is:<br>
<br>
The setting, that you compiled OpenThreads statically is not carried out to a public header or something. If another lib includes a header-file of  OpenThreads the compiler thinks, that OpenThreads is linked for dynamic-usage (because OT_LIBARY_STATIC is not defined so the EXPORT-definition for OpenThreads is not setup correctly), so you'll get multiple defined symbols, when you try to link your app with static OpenThreads and static osg, because osg includes OpenThreads-symbols for dynamic-linking.<br>


<br>
IMHO the definition of OT_LIBARY_STATIC should be carried out to OpenThreads/Config. The same should be done for OSG_LIBRARY_STATIC. On Linux there's no such problem, because you don't have to declare different exports for static versus dynamic linking.<br>


<br>
I am no expert in CMake, so perhaps somebody may jump in here?</blockquote><div><br>You can add OT_LIBRARY_STATIC to OpenThreads/Config but it does rule out the ability to #include the same set of headers and alternate between a static and a shared library version of OpenThreads on MSVC.  It's not uncommon to ship a "foo.lib" and a "foo_static.lib" or "foo_a.lib" with a particular library so the user can choose between either.  It would be relatively easy to add this to OpenThreads one day if it was desired (also generation of libOpenThreads.a) but it would be impossible to arbitrate between the two on MSVC (without using separate install prefixes) if the selection was done in the OpenThreads/Config header file.<br>
<br>I'd say the right thing to do in this case is to push this issue to the user actually linking against the code, in other words the OSG, with the initial fix you suggested.<br></div></div><br>-- <br>Philip Lowman
</div>