From: William S F. <ws...@fu...> - 2006-07-10 21:40:44
|
I think you are saying that you are using multiple modules. If so you'll have to avoid the Java namespace clashes by using a different package name for each module. Compile your C++ code with -DSwig= which will turn the Swig namespace into an anonymous namespace. This should then avoid the namespace linker clash. There is one line in the CHANGES file on -fvisibility, but you are best off consulting the gcc documentation. William Steven Sharp wrote: > Since the classes are in different classes, modules, and made > separately, I don't see anyway for SWIG to be able to tell that > there's a duplicate class name. The errors came at link time (this is > running on Linux/fc4). > > The renamed classes would have ended up looking like > SomethingSuperLongClassNameCommonClass which didn't seem extremely > usable. I added a post-SWIG processing rule to my makefile to get the > namespaces from the .i file and insert them into the _wrap.h and then > prepend them to the _wrap.cxx SwigDirector_ class names. This *seems* > to work or am I borking something that I don't know about yet? > > Also, is there any documentation for the fvisibility flag? I've seen > it mentioned in several postings but I haven't found anything in the > docs about it yet. > > Thanks, > Steven > > On 7/7/06, William S Fulton <ws...@fu...> wrote: >> Steven Sharp wrote: >> > On 7/5/06, William S Fulton <ws...@fu...> wrote: >> >> Steven Sharp <steven.k.sharp <at> gmail.com> writes: >> >> >> >>> Is there any way to put the C++ SwigDirector_Blah classes in a >> >>> namespace? I've tried putting the %feature(director) Blah inside the >> >>> namespace tags with still no luck. I've got a bunch of classes that >> >>> are the same class name in different namespaces but I run into link >> >>> errors with duplicately defined names. >> >>> >> >> SWIG flattens the namespaces into one namespace. Have you tried >> %rename? Also >> >> you can target namespaces for applying any feature including >> directors: >> >> >> >> %director Namespace1::Blah; >> >> >> >> or turn it off for some classes: >> >> >> >> %nodirector Namespace2::Blah; >> >> >> >> If this doesn't solve your problem, post a complete standalone >> interface file >> >> showing the problem. >> >> >> >> William >> >> >> > >> > William, >> > >> > Thanks, that's what I'm doing presently. The problem is that the same >> > class name appears in multiple namespaces in the C++ code. e.g., >> > foo::baz and bar::baz, baz being a template instantiation. When SWIG >> > does its thing, I end up with multiple definitiions of >> > SwigDirector_baz. >> > >> > If I could put the SwigDirector_baz into the foo and bar namespaces, >> > then I wouldn't need to rename baz to be foo_baz and bar_baz. Or is >> > rename the only safe solution for now, barring post processing of the >> > *_wrap.{cpp,h} files to add in the namespaces? >> > >> > >> Well %rename has to be used in SWIG if you have 2 classes with the same >> name in different namespaces. SWIG should error out if it finds such a >> case. Doesn't it do that for you? I've checked that %rename works for >> directors. Here is a complete example: >> >> %module(directors="1") director_namespace_clash >> >> %rename(GreatOne) One::Great; >> >> %feature("director"); >> >> %inline %{ >> namespace One { >> struct Great { >> virtual void superb(int a) {} >> virtual ~Great() {} >> }; >> } >> namespace Two { >> struct Great { >> virtual void excellent() {} >> virtual ~Great() {} >> }; >> } >> %} >> >> >> >> William >> > |