Re: [ROOT] Shared function library.

From: Rene Brun (Rene.Brun@cern.ch)
Date: Wed Oct 25 2000 - 12:14:14 MEST


Hi Jens,
We have plenty of examples in Root itself.
For example, the global gVirtualPS is defined in TVirtualPS.h as

R__EXTERN TVirtualPS  *gVirtualPS;

where R__EXTERN is a macro equivalent to extern on Unix systems.

In the LinkDef file for base we have:

#pragma link C++ class TVirtualPS;
#pragma link C++ global gVirtualPS;

In TVirtualPS.cxx, the global is initialized with:

TVirtualPS *gVirtualPS = 0;

You can use gVirtualPS in the interpreter.

Rene Brun

Jens Ivar Jordre wrote:
> 
> Howdy rooters of the world.
> 
> I have a problem concerning a shared function library I have
> generated. I'm using ROOT 2.25/03 on a dual i686 running RH6.1.
> I have the following files:
> Analyzer.C  -  function source file.
> Analyzer.h  -  header file with function prototypes and include
>                 statements.
> AnalyzerLinkDef.h  -  LinkDef used by rootcint when generating dictionary,
>                 has a.o. statements of the form
>                 #pragma link C++ function <function name>;
>                 for all the functions in my Analyzer.
> 
> My problem is twofold. I.e. first I tried to put the global variable,
> i.e. those variable used by the functions in Analyzer.C, in Analyzer.h.
> I generated dictionary AnalyzerDict.C with
> 
> rootcint -f AnalyzerDict.C -c <include directories> Analyzer.h \
> AnalyzerLinkDef.h
> 
> I then compile the object files Analyzer.o and AnalyzerDict.o, and finally
> I try to link my function library libAnalyzer.so from the mentioned
> object files. The result of this is a list of error messages due to
> multiple definition of the global variables I have in my Analyzer.h. The
> errors look like the following
> 
> AnalyzerDict.o: In function `G___Init_7_33__FP8G__valuePCcP8G__parami':
> /heim/jens/brat/tpm1/AnalyzerDict.C:35: multiple definition of `gNameTPM1'
> Analyzer.o:/heim/jens/brat/tpm1/Analyzer.C:21: first defined here
> 
> I then tried to move the global variable over to the top of my Analyzer.C
> file, and the it compiled with no error. However, I'd like to keep the
> global variable in the header file. Is there a way to do this?
> I tried to include statements of the form
> #pragma link C++ global <global variable name>;
> in my AnalyzerLinkDef.h, but no visible change in the compilation process.
> 
> Secondly, when I run an interactive ROOT session, it would be nice to be
> able to se the content of these global variables. I.e. I simply would
> like to be able to do
> root [12] .p <global variable name>
> after I have called some of the functions in my function library.
> 
> How can this be done. Can ROOT read global variables from a function
> library, or must the function library have a connection to a header file I
> load when I start my ROOT session?
> 
> Any comments will be greatly appreciated.
> Thanks in advance.
> 
> Jens Ivar
> 
> ---
> Jens Ivar Jřrdre, Dep. of Phys., Allégt. 55, N-5007 BERGEN, NORWAY
> e-mail: JensIvar.Jordre@fi.uib.no, phone (temp.): (+47) 55 58 27 92



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:35 MET