From: Mario De C. <ma...@sy...> - 2009-11-27 09:21:33
|
Hi, I am a newbie regarding the whole SWIG thing. I am looking into using Swig as a tool to get a wrapper for an existing (huge, but only parts needed) C++ library to C#. I have browsed the manual, but i am still not quite sure how to start. How do i define the interface ? I have IDL's from the existing library, can i use these with Swig ? Can i use the source headers (although it seems it is not recommended)... Any help/advice would be appreciated !! Thanks, Mario |
From: Herve B. <bla...@gm...> - 2009-11-27 10:00:08
|
IMHO, best way to get started is with the examples. See C:\swig_1.3.40\Examples\csharp after you downloaded/installed SWIG. Hope that helps, Herve. |
From: David P. <dpi...@me...> - 2009-11-27 16:41:47
|
> Hi, > > I am a newbie regarding the whole SWIG thing. > > I am looking into using Swig as a tool to get a wrapper for an > existing > (huge, but only parts needed) C++ library to C#. I have browsed the > manual, but i am still not quite sure how to start. > How do i define the interface ? I have IDL's from the existing library, > can i use these with Swig ? > Can i use the source headers (although it seems it is not > recommended)... > > Any help/advice would be appreciated !! > > Thanks, > > Mario Including header files is often not recommended because they tend to contain things SWIG doesn't understand: everything from special compiler-specific keywords like __declspec to mundane aliases like DWORD and PVOID that are defined in system headers (note that SWIG doesn't follow #include, because you don't want it to follow, say, <stdio.h> and create wrappers for fopen() and printf().) When I use SWIG, I do %include my header files directly. That's because I have control over my header files, and any time SWIG doesn't understand something I can always - wrap it in a "#ifndef SWIG" block so that the C++ compiler sees it but not SWIG. - add a typedef or #define that helps SWIG understand something, or an %ignore to make SWIG ignore it One other tip about including: you can include system headers with %import instead of %include when you want to pull in standard #defines and typedefs but ignore functions. For example I use (on Windows) %import "WinDef.h" The only problems are that 1. if the system header #includes other headers, you have to %import those manually, and 2. SWIG gets the mistaken impression that structures defined in the system headers, such as RECT, are wrapped in another SWIG module. This only causes trouble if you actually need SWIG to wrap one of those structures. Hey William, if you're reading this, don't you figure there should be a %systeminclude command that would avoid these problems? Any other advice you need after reading the manual, just ask this mailing list. |
From: David P. <dpi...@me...> - 2009-11-27 16:56:10
|
> ...(huge, but only parts needed) C++ library... > Can i use the source headers (although it seems it is not > recommended)... Two more points: if you have control over the header files, and you want to %include them directly... - Make sure if header B.h depends on A.h, that you %include A.h first. Occasionally SWIG will generate different (bad) code if you mix up the order, but it will not warn you that you made a mistake. - Since you don't want to create wrappers for everything, put this little gem in a low-level header file: #ifdef SWIG #define INTERNAL protected #else #define INTERNAL public #endif Now, just use INTERNAL when you want SWIG to ignore something: class Foo { public: void f(); // SWIG will wrap this void g(); // SWIG will wrap this INTERNAL: void x(); // SWIG will ignore this void y(); // SWIG will ignore this }; |
From: William S F. <ws...@fu...> - 2009-11-30 21:04:47
|
David Piepgrass wrote: > Including header files is often not recommended because they tend to contain things SWIG doesn't understand: everything from special compiler-specific keywords like __declspec to mundane aliases like DWORD and PVOID that are defined in system headers (note that SWIG doesn't follow #include, because you don't want it to follow, say, <stdio.h> and create wrappers for fopen() and printf().) > > When I use SWIG, I do %include my header files directly. That's because I have control over my header files, and any time SWIG doesn't understand something I can always > > - wrap it in a "#ifndef SWIG" block so that the C++ compiler sees it but not SWIG. > - add a typedef or #define that helps SWIG understand something, or an %ignore to make SWIG ignore it > > One other tip about including: you can include system headers with %import instead of %include when you want to pull in standard #defines and typedefs but ignore functions. For example I use (on Windows) > > %import "WinDef.h" > > The only problems are that > > 1. if the system header #includes other headers, you have to %import those manually, and > 2. SWIG gets the mistaken impression that structures defined in the system headers, such as RECT, are wrapped in another SWIG module. This only causes trouble if you actually need SWIG to wrap one of those structures. > > Hey William, if you're reading this, don't you figure there should be a %systeminclude command that would avoid these problems? How will it know which types to not import given a mix of struct, primitive types and typedefs using structs, typedefs and struct declared in one line statment etc? There is an easy solution though, just ignore any types which you won't be wrapping before it is imported using %ignore, that is %ignore types that you want to treat as an opaque type without a proxy class. William |
From: David P. <dpi...@me...> - 2009-11-30 21:08:49
|
> > 1. if the system header #includes other headers, you have to %import > those manually, and > > 2. SWIG gets the mistaken impression that structures defined in the > system headers, such as RECT, are wrapped in another SWIG module. This > only causes trouble if you actually need SWIG to wrap one of those > structures. > > > > Hey William, if you're reading this, don't you figure there should be > a %systeminclude command that would avoid these problems? > > How will it know which types to not import given a mix of struct, > primitive types and typedefs using structs, typedefs and struct > declared > in one line statment etc? There is an easy solution though, just ignore > any types which you won't be wrapping before it is imported using > %ignore, that is %ignore types that you want to treat as an opaque type > without a proxy class. Ahh yes, but what if you actually want SWIG to produce a wrapper for a system structure like RECT? Then you would have to use %include, and %ignore all structures that happen to be in the same system header file, other than the one you want. Or can you somehow use %ignore and still get SWIG to produce a wrapper? I was thinking a recursive "%systemimport" would be really handy for system header files, but then again, in the real world SWIG might get tripped up by compiler extensions like __declspec. Oh well. |
From: William S F. <ws...@fu...> - 2009-12-01 19:16:52
|
David Piepgrass wrote: >>> 1. if the system header #includes other headers, you have to %import >> those manually, and >>> 2. SWIG gets the mistaken impression that structures defined in the >> system headers, such as RECT, are wrapped in another SWIG module. This >> only causes trouble if you actually need SWIG to wrap one of those >> structures. >>> Hey William, if you're reading this, don't you figure there should be >> a %systeminclude command that would avoid these problems? >> >> How will it know which types to not import given a mix of struct, >> primitive types and typedefs using structs, typedefs and struct >> declared >> in one line statment etc? There is an easy solution though, just ignore >> any types which you won't be wrapping before it is imported using >> %ignore, that is %ignore types that you want to treat as an opaque type >> without a proxy class. > > Ahh yes, but what if you actually want SWIG to produce a wrapper for a system structure like RECT? Then you would have to use %include, and %ignore all structures that happen to be in the same system header file, other than the one you want. Or can you somehow use %ignore and still get SWIG to produce a wrapper? > Well yes, either you need to %import or %include a header file and %ignore types selectively. Otherwise selectively copy types from the header into an interface file. > I was thinking a recursive "%systemimport" would be really handy for system header files, but then again, in the real world SWIG might get tripped up by compiler extensions like __declspec. Oh well. > The -importall option does this and extensions like __declspec are easy to deal with. Usually system headers contain all sorts of junk which is not usually needed for wrappers though. William |