From: Victor D. <Victor.Duchovni@MorganStanley.com> - 2007-04-28 21:06:54
|
On Sat, Apr 28, 2007 at 03:41:04PM -0400, Victor Duchovni wrote: > Foo.i: > typedef struct Conn { > ... > } Conn; > %extend Conn { > Conn() { ... } > ~Conn() { ... } > Xfer() { ... } > } > > Bar.i: > typedef struct Conn { > ... > } Conn; > %extend Conn { > Conn() { ... } > ~Conn() { ... } > Xfer() { ... } > } > > I build Foo.so and Bar.so, and try to use both from Perl: > > use Foo; > use Bar; > > my $fooconn = Foo::Conn->new(); > my $barconn = Bar::Conn->new(); > > and run into problems here because the wrapper names in the two shared > libraries are identical and global, so the wrong wrappers are called. > In each share library I have: > > _wrap_new_Conn > _wrap_delete_Conn > _wrap_Conn_Xfer > > what is the best practice for avoid such name collisions. I can try to > keep all the leaf-node class names globally unique, but this is not easy, > and what if someone else writes another swig module I want to use, and > they use Baz::Conn? > > Do I solve in SWIG? Or are there tricks for building the shared libraries > in such a way that the trap is avoided? I am for now resorting to brute-force in the Makefile: perl -pe 's/(^XS\(_wrap_)/SWIGINTERN $1/' Foo_wrap.c > Foo.c perl -pe 's/(^XS\(_wrap_)/SWIGINTERN $1/' Bar_wrap.c > Bar.c then building Foo.so and Bar.so from those, but this is not particularly elegant, is there a trick I am missing for getting the XS wrappers to have library scope? The new global symbols I get are: A _DYNAMIC A _GLOBAL_OFFSET_TABLE_ A __bss_start A _edata A _end T _fini T _init T boot_Foo A _DYNAMIC A _GLOBAL_OFFSET_TABLE_ A __bss_start A _edata A _end T _fini T _init T boot_Bar which is nicely minimal. -- Viktor. |