[ROOT] ROOT class with ifstream

From: Hajime Nanjyo (nanjyo@icepp.s.u-tokyo.ac.jp)
Date: Tue Jan 27 2004 - 04:07:24 MET


Dear Rooters,
I forget the subject of the last mail
for the ROOT class which have a member of ifstream.

Best Regards,
Hajime

> Dear Rooters,
> 
> I am suffering troubles when constructing my class
> with ifstream for ROOT I/O.
> 
> The shared library, libMyClass.so is successfully construced, but
> it can't be linked to other objects and can't be loaded in ROOT(CINT).
> 
> If the line, 'std::ifstream fi;   //! excluded'
> is commented out (at MyClass.h), all works fine.
>     
> 
> Is there any idea to solve the problem?
> 
> /////////////////////////////////////////////////
> The error outputs are...
> 
> root [1] gSystem->Load("libMyClass")
> dlopen error: /afs/cern.ch/user/n/nanjo/MyClassStreamer/./libMyClass.so: undefined symbol: _ZNSt8ios_baseC2ERKS_
> Load Error: Failed to load Dynamic link library /afs/cern.ch/user/n/nanjo/MyClassStreamer/./libMyClass.so
> *** Interpreter error recovered ***
> 
> or
> 
> g++ `root-config --cflags` -c MyClass.C
> rootcint -f MyClassDict.C -c MyClass.h MyClassLinkDef.h
> g++ `root-config --cflags` -c MyClassDict.C
> g++ -shared MyClass.o MyClassDict.o -o  libMyClass.so
> // Succeed
> g++ `root-config --cflags` -c write.C
> // OK
> g++ write.o libMyClass.so `root-config --libs` -o write
> // Fail
> libMyClass.so: undefined reference to `std::ios_base::ios_base[not-in-charge](std::ios_base const&)'
> collect2: ld returned 1 exit status
> 
> 
> /////////////////////////////////////////////////
> My environment is...
> 
> uname -a
> Red Hat Linux release 7.3 (Valhalla)
> Linux lxplus072 2.4.20-28.7.cernsmp #1 SMP Fri Jan 9 12:37:16 CET 2004 i686 unknown.
> 
> g++ -v
> Reading specs from /usr/local/gcc-alt-3.2/lib/gcc-lib/i686-pc-linux-gnu/3.2/specs
> Configured with: ./configure --prefix=/usr/local/gcc-alt-3.2 --enable-shared
> Thread model: posix
> gcc version 3.2
> 
> The ROOT is on afs at CERN.
>   *******************************************
>   *                                         *
>   *        W E L C O M E  to  R O O T       *
>   *                                         *
>   *   Version   3.10/02  16 December 2003   *
>   *                                         *
>   *  You are welcome to visit our Web site  *
>   *          http://root.cern.ch            *
>   *                                         *
>   *******************************************
> ///////////////////////////////////////////////////
> 
> 
> 
> 
> My codes are as follows.
> 
> ///////////////////////////////////////////////////
> //
> //  MyClass.h
> //
> #ifndef MyClass_HH
> #define MyClass_HH
> #include <fstream>
> 
> #include "TObject.h"
> 
> class  MyClass: public TObject
> {
>  public:
>   MyClass();
>   ~MyClass();
>   void Set(int s);
> 
>  public:
>   int      size;
>   std::ifstream fi;   //! excluded 
>   ClassDef(MyClass,1) //MyClass
> };
> 
> #endif
> ///////////////////////////////////////////////////
> ///////////////////////////////////////////////////
> ///////////////////////////////////////////////////
> //
> // MyClass.C
> //
> #include "MyClass.h"
> #if !defined(__CINT__)
> ClassImp(MyClass);
> #endif
> MyClass::MyClass() {
>   size=0;
> }
> 
> MyClass::~MyClass() {
>   ;
> }
> 
> 
> void MyClass::Set(int s) {
>   size=s;
> }
> 
> ///////////////////////////////////////////////////
> //
> // hadDataLinkDef.h
> //
> #ifdef __CINT__
> #pragma link off all globals;
> #pragma link off all classes;
> #pragma link off all functions;
> #pragma link C++ class MyClass;
> #endif
> ///////////////////////////////////////////////////
> ///////////////////////////////////////////////////
> ///////////////////////////////////////////////////
> //
> // write.C
> //
> #include "TApplication.h"
> #include "TFile.h"
> #include "TTree.h"
> #include "MyClass.h"
> 
> int main(int argc,char** argv)
> {
>   TApplication app("app", &argc, argv);
>   TFile *tf = new TFile("tmp.root","RECREATE");
>   TTree *tree = new TTree("tree","tmp");
> 
>   MyClass *data = new MyClass();
>   tree->Branch("data","MyClass",&data);
> 
>   for (int i=0;i<5;++i) {
>     data->Set(i+1);
>     tree->Fill();
>   }
> 
>   tf->Write();
>   delete data;
> 
>   return 0;
> }
> ///////////////////////////////////////////////////
> ///////////////////////////////////////////////////
> ///////////////////////////////////////////////////
> //
> // compile script
> //
> rm *.o
> rm *.so
> rm MyClassDict.C
> g++ `root-config --cflags` -c MyClass.C
> rootcint -f MyClassDict.C -c MyClass.h MyClassLinkDef.h
> g++ `root-config --cflags` -c MyClassDict.C
> g++ -shared MyClass.o MyClassDict.o -o  libMyClass.so 
> g++ `root-config --cflags` -c write.C
> g++ write.o libMyClass.so `root-config --libs` -o write
> ///////////////////////////////////////////////////



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:05 MET