B
ben chang
i'm hacking at some code originally written for VC++, trying to port to
linux GCC 4. the linker returns multiple-definition errors with a
singleton object, which i guess is not a problem in visual c++. i'll try
to excerpt the relevant parts without posting all the source files (it's
the maya exporter for the Ogre 3D engine).
there's a pretty standard-looking Singleton template, and in a file called
"materialSet.h" we have a class using it:
/////
namespace OgreMayaExporter
{
class MaterialSet : public Singleton<MaterialSet>
{
(nothing unusual in here, so i won't bore you... )
};
template<> MaterialSet Singleton<MaterialSet>::ms_Singleton=0;
}
/////
now, materialSet.h is included directly or indirectly by a bunch of source
files (blendshape.cpp, ogreExporter.cpp, skeleton.cpp, mesh.cpp). so i get
this linker error:
g++ -c -I. -I../include -I/usr/autodesk/maya/include -I/usr/X11R6/include -I/usr/local/include/OGRE -pipe -D_BOOL -DLINUX -DI386 -ffast-math submesh.cpp
g++ -shared -o OgreExport blendshape.o material.o mesh.o ogreExporter.o paramlist.o particles.o skeleton.o submesh.o -L/usr/autodesk/maya/lib -lOpenMaya -lOgreMain
mesh.o.bss+0x0): multiple definition of `OgreMayaExporter::Singleton<OgreMayaExporter::MaterialSet>::ms_Singleton'
blendshape.o.bss+0x0): first defined here
ogreExporter.o.bss+0x0): multiple definition of `OgreMayaExporter::Singleton<OgreMayaExporter::MaterialSet>::ms_Singleton'
blendshape.o.bss+0x0): first defined here
skeleton.o.bss+0x0): multiple definition of `OgreMayaExporter::Singleton<OgreMayaExporter::MaterialSet>::ms_Singleton'
blendshape.o.bss+0x0): first defined here
submesh.o.bss+0x0): multiple definition of `OgreMayaExporter::Singleton<OgreMayaExporter::MaterialSet>::ms_Singleton'
blendshape.o.bss+0x0): first defined here
this declaration is complicated enough that it's a bit hard to wrap my
head around, but isn't this essentially repeatedly declaring a global
(within the namespace) variable, which is what Singletons are supposed to
avoid? is this a difference between gcc and msvc?
thanks,
-ben
linux GCC 4. the linker returns multiple-definition errors with a
singleton object, which i guess is not a problem in visual c++. i'll try
to excerpt the relevant parts without posting all the source files (it's
the maya exporter for the Ogre 3D engine).
there's a pretty standard-looking Singleton template, and in a file called
"materialSet.h" we have a class using it:
/////
namespace OgreMayaExporter
{
class MaterialSet : public Singleton<MaterialSet>
{
(nothing unusual in here, so i won't bore you... )
};
template<> MaterialSet Singleton<MaterialSet>::ms_Singleton=0;
}
/////
now, materialSet.h is included directly or indirectly by a bunch of source
files (blendshape.cpp, ogreExporter.cpp, skeleton.cpp, mesh.cpp). so i get
this linker error:
g++ -c -I. -I../include -I/usr/autodesk/maya/include -I/usr/X11R6/include -I/usr/local/include/OGRE -pipe -D_BOOL -DLINUX -DI386 -ffast-math submesh.cpp
g++ -shared -o OgreExport blendshape.o material.o mesh.o ogreExporter.o paramlist.o particles.o skeleton.o submesh.o -L/usr/autodesk/maya/lib -lOpenMaya -lOgreMain
mesh.o.bss+0x0): multiple definition of `OgreMayaExporter::Singleton<OgreMayaExporter::MaterialSet>::ms_Singleton'
blendshape.o.bss+0x0): first defined here
ogreExporter.o.bss+0x0): multiple definition of `OgreMayaExporter::Singleton<OgreMayaExporter::MaterialSet>::ms_Singleton'
blendshape.o.bss+0x0): first defined here
skeleton.o.bss+0x0): multiple definition of `OgreMayaExporter::Singleton<OgreMayaExporter::MaterialSet>::ms_Singleton'
blendshape.o.bss+0x0): first defined here
submesh.o.bss+0x0): multiple definition of `OgreMayaExporter::Singleton<OgreMayaExporter::MaterialSet>::ms_Singleton'
blendshape.o.bss+0x0): first defined here
this declaration is complicated enough that it's a bit hard to wrap my
head around, but isn't this essentially repeatedly declaring a global
(within the namespace) variable, which is what Singletons are supposed to
avoid? is this a difference between gcc and msvc?
thanks,
-ben