From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,4cabfb8e49247533 X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!postnews.google.com!f14g2000cwb.googlegroups.com!not-for-mail From: "Lucretia" Newsgroups: comp.lang.ada Subject: Re: Multiple shared libraries with a single spec Date: 4 Nov 2005 07:53:02 -0800 Organization: http://groups.google.com Message-ID: <1131119582.929654.323550@f14g2000cwb.googlegroups.com> References: <1131107328.981560.222350@g43g2000cwa.googlegroups.com> NNTP-Posting-Host: 194.74.199.42 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" X-Trace: posting.google.com 1131119587 29698 127.0.0.1 (4 Nov 2005 15:53:07 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Fri, 4 Nov 2005 15:53:07 +0000 (UTC) User-Agent: G2/0.2 X-HTTP-UserAgent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705),gzip(gfe),gzip(gfe) X-HTTP-Via: 1.0 Symantec_Web_Security (3.0.1.74), 1.0 C2100-0050414028 (NetCache NetApp/5.5R5) Complaints-To: groups-abuse@google.com Injection-Info: f14g2000cwb.googlegroups.com; posting-host=194.74.199.42; posting-account=G-J9fgwAAADgpzBiEyy5tO4f8MX5fbpw Xref: g2news1.google.com comp.lang.ada:6196 Date: 2005-11-04T07:53:02-08:00 List-Id: Stephen Leake wrote: > Excellent idea. Yup, just makes this sort of stuff easier to develop. > Locating the object files with the source files is in general a bad > idea, but not relevant to this discussion. See previous post. > > Now, I could export a bunch of C functions and use dlopen/dlsym, etc. > > but this isn't the best way and it doesn't allow you to use your Ada > > libs the way you want to. Also it would make the types slow to use if > > they had to go through C constructors and interfaces (like you would a > > C++ shared library). > > C doesn't have 'constructors', so I don't know what you mean here. No, it doesn't but when you create a C++ class library, the easiest way to do this is to export a C constructor function, e.g. extern "C" My_Funky_Class *My_DLL_New(void); extern "C" void My_DLL_Delete(My_Funky_Class *Ptr); This is what I don't want as any function that uses the maths routines, basically everything, will end up being really slow as each vector object will be a "pointer to" and every reference will have to be dereferenced. This is bad for speed in 3D apps. > If you want the main program to choose which library implementation to > use at run time, then dynamic library linking is the only option. This > would make sense for a program that could take advantage of different > flavors of x86, as you describe above. > > > I have just created a test program which creates 2 shared libs (in > > separate directories with separate makefiles) and then created adalib > > and adainclude directories in which the lib, ali and ads files were > > linked to. I then built the test app which linked to the files in > > adalib and adainclude. I could then use a symlink to change the library > > used. This works, but I'm not too sure if it's the correct way to do > > this. > > It's one valid way, and has the advantage of being compiler > independent. But it isn't operating system independent; you can't do > this on Windows. This isn't compiler independent as the library generated won't be able to be used from another Ada compiler, i.e. the name mangling may not be the same. But you should be able to do this on Windows, as I have created 2 types of C++ class DLL in the past, 1 which uses the C constructor mechanism described above (i.e. the COM interface type) and another where the C++ class can be linked to directly without using the interface mechanism. > > Has anyone else done this sort of thing with GNAT? > > I use GNAT project files for this; one project file per target. The > Source_Dirs value specifies what Ada bodies to use, by specifying the > directory search path. All objects are placed in one build directory; > one build directory per target. Hmmm, haven't used project files yet. I ask about this, because I'm generating 2 libs, each have slightly different ALI's and I was wondering whether this way would cause problems in the future? Thanks, Luke.