Hello Markus,
I need to make a correction to Fons's comment.
In fact, what Markus have done is almost correct.
I guess the problems was that you did not compile
and link definition of member function when making
shared library. Probably, you linked only dictionary
files.
$ rootcint -f Teq_clientDict.cxx -c eq_client.h LinkDef.h
$ g++ -fPIC -c -I$ROOTSYS/include eq_clientDict.cxx
$ g++ -shared -I$ROOTSYS/include -o eq_client.so eq_clientDict.o
You need to add TScreen.cxx also.
$ g++ -fPIC -c -I$ROOTSYS/include eq_client.cxx
$ g++ -shared -I$ROOTSYS/inclue -o eq_client.so eq_clientDict.o eq_client.o
Note that compiler options shown above may not be correct. I simply tried
to show you a concept. You may also want to give definition of EqData to
rootcint.
Thank you
Masaharu Goto
>Date: Wed, 07 Mar 2001 16:31:51 +0000
>From: Fons Rademakers <Fons.Rademakers@cern.ch>
>To: Markus Huening <mhuening@sun52a.desy.de>
>Cc: roottalk@pcroot.cern.ch, Masaharu Goto <MXJ02154@niftyserve.or.jp>
>Subject: Re: [ROOT] making of libraries
>
>Hi Markus,
>
> you can not fake a complete classes. CINT needs to know the correct
>sizes when creating EqAdr and EqData objects grabber and grab.
>
>It will work if you make grabber and grab pointers to EqAdr and EqData.
>In that case you have only to provide simple forward declarations.
>
>#if !defined(__CINT__)
>
>#include <eq_client.h>
>#include "/usr/ttfsvr2/doocs/lib/include/eq_client.h"
>
>#else
>
>class EqAdr;
>class EqData;
>
>#endif
>
>
>Cheers, Fons.
>
>
>
>Markus Huening wrote:
>>
>> Hallo everybody,
>>
>> I have some problem when I try to include some external library into my
>> own to make it executeable with CINT. I couldn't read it directly with
>> rootcint so I tried some workaround which I found in the FAQs:
>> ...
>>
>> #if !defined(__CINT__)
>>
>> #include <eq_client.h>
>> #include "/usr/ttfsvr2/doocs/lib/include/eq_client.h"
>>
>> #else
>>
>> class EqAdr;
>> {
>> public:
>> EqAdr();
>> ~EqAdr();
>> void adr(char*);
>> };
>> class EqData;
>> class EqCall
>> {
>> public:
>> EqCall();
>> ~EqCall();
>> EqData set(EqAdr*, EqData*);
>> };
>>
>> #endif
>> */
>>
>> class TScreen : public TH2S
>> {
>> private:
>> EqAdr grabber;
>> EqData grab;
>> EqData *dcsresult;
>> EqCall *dcscall;
>>
>> ...
>>
>> This works in compiled programs and I can load the library
>> (gSystem->Load) into the CINT. But as soon as I start the constructor of
>> TScreen (which also initialises grabber, grab, dcsresult & dcscall),
>> the interpreter is aborted with the error message
>> ...
>> root [1] fImg=TScreen("fImg","Picture from Viewscreen",640,256);
>> ld.so.1: /home/rasmus/Root/ROOT/bin/root.exe: fatal: relocation error:
>> file /home/mhuening/root/own/libTScreen.so: symbol __0oFEqAdrctv:
>> referenced symbol not found
>> ...
>>
>> What did I do wrong?
>>
>> Greetings
>>
>> Markus Huening
>> ======================================================
>> Markus Huening
>> Desy/FDET
>> Notkestrasse 85
>> D-22607 Hamburg
>> Germany
>>
>> Tel: ++49 (040)8998-3030
>> Fax: ++49 (040)8998-3094
>> e-mail: markus.huening@desy.de
>
>--
>Org: CERN, European Laboratory for Particle Physics.
>Mail: 1211 Geneve 23, Switzerland
>E-Mail: Fons.Rademakers@cern.ch Phone: +41 22 7679248
>WWW: http://root.cern.ch/~rdm/ Fax: +41 22 7677910
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:39 MET