Re: [CINT] FW: [ROOT] CINT and STL vector of private class

From: Masaharu Goto (MXJ02154@nifty.ne.jp)
Date: Mon Apr 21 2003 - 13:31:06 MEST


Hello Xiaorong,

You need to change Dimuon.hh and Particle.hh as attached files.
#include <vector> is needed because vector is referenced in
LinkDef files.  You also need default constructor for Dimuon 
and Particle class in order to use vector.   Compiling libDimun.so
after those changes,  try.C works without problem.

Thank you
Masa Goto


----- Original Message ----- 
From: "Xiaorong Wang" <phyxxw@panther.gsu.edu>
To: "'Masaharu Goto'" <MXJ02154@nifty.ne.jp>
Sent: Monday, April 21, 2003 6:44 AM
Subject: RE: [CINT] FW: [ROOT] CINT and STL vector of private class


> Dear Masa,
> 
> Many thanks for your patience! I read the root shared library part. I
> tried it as following: attached files are list here, this time I can't
> compile it. 
> 
> --Dimuon.hh Particle.hh  class header files;
> --Dimuon.cc Particle.cc  Implementation files
> --DimuonLinkDef.h ParticleLinkDef.h
> --Makefile.am autogen.sh configure.in  use to generate Makefile,
> --try.C  root macro file 
> 
> when I complie these files I got error message;
> 
> *************************************************
> [phenix@cluster build]# make install
> /bin/sh ./libtool --mode=compile c++ -DPACKAGE=\"Dimuon\"
> -DVERSION=\"1.00\"  -I. -I..  -I. -I..
> -I/home/phenix/xrwang/test/Dimuon/install/include
> -I/home/phenix/download/root-3.01.05-gcc-2.95.3/include    -g -O2 -c
> ../Dimuon.cc
> c++ -DPACKAGE=\"Dimuon\" -DVERSION=\"1.00\" -I. -I.. -I. -I..
> -I/home/phenix/xrwang/test/Dimuon/install/include
> -I/home/phenix/download/root-3.01.05-gcc-2.95.3/include -g -O2
> -Wp,-MD,.deps/Dimuon.pp -c ../Dimuon.cc  -fPIC -DPIC -o Dimuon.lo
> rootcint -f DimuonDict.C -c  -DPACKAGE=\"Dimuon\" -DVERSION=\"1.00\"
> -I. -I..  -I. -I.. -I/home/phenix/xrwang/test/Dimuon/install/include
> -I/home/phenix/download/root-3.01.05-gcc-2.95.3/include ../Dimuon.hh
> ../DimuonLinkDef.h
> Error: no such template vector<Dimuon> FILE:../DimuonLinkDef.h LINE:8
> Note: link requested for unknown class vector<Dimuon>
> FILE:../DimuonLinkDef.h LINE:8
> Warning: Error occured during reading source files
> class Dimuon in ../Dimuon.hh line 8 original base of virtual func
> Warning: Error occured during dictionary source generation
> !!!Removing DimuonDict.C DimuonDict.h !!!
> rootcint: error loading headers...
> make: *** [DimuonDict.C] Error 1
> [phenix@cluster build]#
> ***********************************************
> 
>  
> 
> -----Original Message-----
> From: owner-roottalk@pcroot.cern.ch
> [mailto:owner-roottalk@pcroot.cern.ch] On Behalf Of Masaharu Goto
> Sent: Sunday, April 20, 2003 6:56 AM
> To: Xiaorong Wang; 'Philippe Canal'; 'Cint'; roottalk@pcroot.cern.ch
> Subject: Re: [CINT] FW: [ROOT] CINT and STL vector of private class
> 
> Hello Xiaorong,
> 
> Are you familiar about making ROOT shared library? If not,
> my explanation was not kind enough.
> 
> > noinst_HEADERS = \
> >   ParticleDict.h ParticleLinkDef.h \
> >   DimuonDict.h ParticleLinkDef.h
> 
> Normally, you need to put those #pragma statements in
> LinkDef.h file and it must be after '#pragma link off all classes;'.
> 
> Then, of course you have to regenerate and recompile the
> dictionaries.  For more detail, please read ROOT documentation
> about compiling shared library.
> 
> Thank you
> Masa Goto
> 
> 
> 
> ----- Original Message -----
> From: "Xiaorong Wang" <phyxxw@panther.gsu.edu>
> To: "'Masaharu Goto'" <MXJ02154@nifty.ne.jp>; "'Philippe Canal'"
> <pcanal@fnal.gov>; "'Cint'" <cint@pcroot.cern.ch>;
> <roottalk@pcroot.cern.ch>
> Sent: Saturday, April 19, 2003 9:27 PM
> Subject: RE: [CINT] FW: [ROOT] CINT and STL vector of private class
> 
> 
> > Dear Masa,
> >
> > Thanks for your reply. Sorry I still can not get it work. Could you
> tell
> > me where I should put those command. I tried following two way.
> >
> > 1) I add
> > #include <vector>
> > ...class
> > #ifdef __MAKECINT__
> > #pragma link C++ class vector<Particle>;
> > #endif
> > in Particle class header file
> >
> > #include <vector>
> > ...class
> > #ifdef __MAKECINT__
> > #pragma link C++ class vector<Dimuon>;
> > #endif
> > in Dimuon class header file
> >
> > when I run the root micro file I got
> >
> > *********************
> > root [0] .L try.C
> > root [1] main()
> > Error: Can't call vector<Particle,__malloc_alloc_template<0>
> > >::push_back(*muon1) in current scope FILE:try.C LINE:29
> > Possible candidates are...
> > filename       line:size busy function type and name  (in
> > vector<Particle,__malloc_alloc_template<0> >)
> > *** Interpreter error recovered ***
> > root [2]
> > **************************
> >
> > 2) I wrote DimuonLinkDef.h and ParticleLinkDef.h  files
> >
> > and in Makefile.am I added
> >
> > noinst_HEADERS = \
> >   ParticleDict.h ParticleLinkDef.h \
> >   DimuonDict.h ParticleLinkDef.h
> >
> > I got same error message like  before.
> >
> > Thanks  for your time!
> >
> > Xiaorong
> >
> >
> >
> >
> > -----Original Message-----
> > From: owner-roottalk@pcroot.cern.ch
> > [mailto:owner-roottalk@pcroot.cern.ch] On Behalf Of Masaharu Goto
> > Sent: Thursday, April 17, 2003 7:18 AM
> > To: Philippe Canal; Cint; roottalk@pcroot.cern.ch
> > Subject: Re: [CINT] FW: [ROOT] CINT and STL vector of private class
> >
> > Hello Xiaorong,
> >
> > I am happy to answer your question.
> >
> > This is a Cint limitation. You have STL container classes
> > vector<Dimuon> and vector<Particle> interpreted.  they
> > work to some extent, but not perfect. You'll find this kind
> > of problem as you go on.  Solution is to precompile
> > vector<Dimuon> and vector<Particle> in libDimuon.so
> > using  #pragma link statement.
> >
> >
> > #include <vector>
> >
> > class Particle { .... };
> > class Dimuon { .... };
> >
> > #ifdef __MAKECINT__
> > #pragma link C++ class vector<Dimuon>;
> > #pragma link C++ class vector<Particle>;
> > #endif
> >
> > Then, things will be fine.
> >
> > Thank you
> > Masa Goto
> >
> >
> >
> >
> > ----- Original Message -----
> > From: "Philippe Canal" <pcanal@fnal.gov>
> > To: "Cint" <cint@pcroot.cern.ch>
> > Sent: Thursday, April 17, 2003 12:06 AM
> > Subject: [CINT] FW: [ROOT] CINT and STL vector of private class
> >
> >
> > >
> > >
> > > -----Original Message-----
> > > From: owner-roottalk@pcroot.cern.ch
> > > [mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Xiaorong Wang
> > > Sent: Tuesday, April 15, 2003 11:21 PM
> > > To: 'Rene Brun'
> > > Cc: 'Root Mailinglist'
> > > Subject: [ROOT] CINT and STL vector of private class
> > >
> > >
> > > Dear Root expert,
> > >
> > > I need your help on this issue. I am using ROOT 3.01/05, linux 7.3.
> > > Thanks for your time.
> > >
> > > I created two private class Paricle and Dimuon(two particles build
> one
> > > Dimuon), and use
> > >
> > > rootcint -f $*Dict.C -c $(CINTFLAGS) $(DEFS) $(INCLUDES) $*.hh
> > >
> > > to generate the root dictionary and library file libDimuon.so.
> > >
> > > I load this library and use STL vector in root macro file
> > >
> > > *********************
> > > #include <iostream>
> > > #include <fstream>
> > > #include <stdio.h>
> > > #include <vector>
> > >
> > > class Dimuon;
> > > class Particle;
> > >
> > > void main()
> > > {
> > >   gSystem->Load("install/lib/libDimuon.so");
> > >   vector<Dimuon> DimuVec;
> > >   vector<Particle> ParVec;
> > >
> > >   int q1 = -1;
> > >   int q2 = 1;
> > >   float E1=3.0;
> > >   float Px1=1.0;
> > >   float Py1=1.0;
> > >   float Pz1=1.0;
> > >   float E2= 5.0;
> > >   float Px2=1.4;
> > >   float Py2=1.2;
> > >   float Pz2=1.0;
> > >
> > >   Particle *muon1 = new Particle(q1, E1,Px1,Py1,Pz1);
> > >   Particle *muon2 = new Particle(q2, E2,Px2,Py2,Pz2);
> > >
> > >   ParVec.push_back(*muon1);
> > >   ParVec.push_back(*muon2);
> > >
> > >   Dimuon *jpsi = new Dimuon(muon1, muon2);
> > >   DimuVec.push_back(*jpsi);
> > >
> > >   delete muon1;
> > >   delete muon2;
> > >   delete jpsi;
> > >
> > >   vector<Particle>::iterator mu1;
> > >   for (mu1 = ParVec.begin(); mu1 < ParVec.end(); ++mu1){
> > >     cout << "I am here particle iterator loop " << endl;
> > >   }
> > >
> > >   vector<Dimuon>::iterator dimu;
> > >   for (dimu = DimuVec.begin(); dimu < DimuVec.end(); ++dimu){
> > >     cout << "I am here Dimuon iterator loop " << endl;
> > >   }
> > >   cout << "DimuVec size= " << DimuVec.size() << endl;
> > >   cout << "ParVec size= " << ParVec.size() << endl;
> > >
> > > }
> > >
> > > ********************************************
> > >
> > > when I run this marco, I got correct output, at the end of the root
> > run,
> > > it crash by segmentation violation.
> > >
> > > ***************
> > > root [0] .L try.C
> > > root [1] main()
> > > I am here particle iterator loop
> > > I am here particle iterator loop
> > > I am here Dimuon iterator loop
> > > DimuVec size= 1
> > > ParVec size= 2
> > >
> > >  *** Break *** segmentation violation
> > > Root > Function main() busy flag cleared
> > > ****************
> > >
> > > when I trace this root file: I got
> > >
> > > *************
> > > void destroy(Dimuon* first, Dimuon* last) {
> > >     while (first != last) destroy(first++);
> > > }
> > > !!! Reading template destroy
> > > # 120 "algobase.h"
> > > 120
> > > 121  void destroy(Dimuon* first, Dimuon* last) {
> > > 122      while (first != last) destroy(first++);
> > > 123  }
> > > !!!Complete instantiating template destroy
> > >
> > >  *** Break *** segmentation violation
> > > Root > !!!Destroy static member object 0x883f838
> > > vector<Particle>::~TRint() !!!Destroy static member object 0x8822e58
> > > vector<Dimuon>::~TRint() Function main() busy flag cleared
> > > **************
> > >
> > > PS: I can do this correctly using standard C++ without CINT, is this
> > > CINT problem or I did something wrong.
> > >
> > > Thanks,
> > > Xiaorong
> > >
> > >
> > >
> >
> >
> 
> 






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