[ROOT] Re: [CINT] cint help!?!

From: Christian Holm Christensen (cholm@hehi03.nbi.dk)
Date: Fri Feb 07 2003 - 17:10:57 MET


Hi Yvonne, 

[Put it on roottalk as it's ROOT centric]

Yvonne Becherini <Yvonne.Becherini@bo.infn.it> wrote concerning
  Re: [CINT] cint help!?! [Fri, 07 Feb 2003 15:48:07 +0000 (UTC)] 
----------------------------------------------------------------------
> 
> Thank you for the help Christian,
> 
> if I type: 
> 
> nm libevent.so | grep -e "^ *U "
> 
> I get a huge list of symbols.

Did you see any member functions of the event class as undefined?  If
so, you better implement them!  Do 

    
  nm -C  libevent.so | grep -e "^ *U " | grep "event" 

(Note that the `-C' option gives more human-readable output)

> I did some very small changes in the source and now the root macro stops 
> when it trying to build the event object and I have the following message 
> under root:
> 
> /usr/local/root/bin/root.exe: relocation error: libevent.so: undefined symbol: __5event

Your problem lies at the linking/compilation stage.  

 * Check that _all_ member functions are defined either inline or in a
   compiled source file.  One thing that often happens, is that people
   forget a constructor or the destructor

     class foo { 
       ...
     public: 
       foo();  // This should be implemented in a source file or inline
       ~foo(); // This should be implemented in a source file or inline
       ...
     };  

 * Check that all the `ROOT-centric' member functions are defined.
   Sometimes people forget to use the ClassImp macro 

     // `Header' (or declaration) file 
     class foo {
       ...
       ClassDef(foo,0) // If you use this, you _must_ use ClassImp too
     };

     // `Source' (or definition) file 
     ClassImp(foo);
     
 * Check that you link all the object files into the library.
   Sometimes people forget the CINT generated file. 

     rootcint -f fooDict.cxx -c foo.h 
     g++ `root-config --cflags` -c -Wall -g foo.cc 
     g++ `root-config --cflags` -c -Wall -g fooDict.cxx 
     g++ -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.1 foo.o fooDict.o 
     ln -s libfoo.so.1.1 libfoo.so.1
     ln -s libfoo.so.1 libfoo.so

 * Watch out for the optimisation used by `GCC' 2.96-RH on SMP
   machines - don't go higher than 1 (option -O1) as it may strip some
   inline member function, and those need to be defined when loading
   the library into a ROOT interactive session. 

 * Check that the header file has the same name as the class you're
   generating a dictionary for.   If your header is `foo.h' CINT will
   assume that you want a dictionary for the class `foo'
   _and_nothing_else_.  If your header files base name isn't the same
   as the class name, or you need to create dictionaries for multiple
   classes in one go, you need a `linkdef' file 

      #ifndef __CINT__
      #error Not for compilation
      #endif

      #pragma link off all functions;
      #pragma link off all globals;
      #pragma link off all classes;

      #pragma link C++ class foo+;
      #pragma link C++ class bar+;
      #pragma link C++ class baz+;

    and pass that file as the last argument to rootcint

      rootcint -f fooDict.cxx -c header.h linkdef.h 

Hope those points help you out. 

Yours, 

 ___  |  Christian Holm Christensen 
  |_| |	 -------------------------------------------------------------
    | |	 Address: Sankt Hansgade 23, 1. th.  Phone:  (+45) 35 35 96 91
     _|	          DK-2200 Copenhagen N       Cell:   (+45) 24 61 85 91
    _|	          Denmark                    Office: (+45) 353  25 305
 ____|	 Email:   cholm@nbi.dk               Web:    www.nbi.dk/~cholm
 | |



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:09 MET