Re: an example for the .so - problems @ reading

From: Rene Brun (Rene.Brun@cern.ch)
Date: Tue May 18 1999 - 19:48:17 MEST


Hi Jorg,
My suspicion is that you did not create the dictionary for your
small file. If you follow the following procedure, your compiled
program will work (here on Linux)

rootcint -f cint.C -c read.h rLinkDef.h
g++  -fno-rtti -fno-exceptions -fPIC -I$ROOTSYS/include -c cint.C read.C
g++ -g -Wl,-soname,myclass.so -shared cint.o read.o -o myclass.so

file read.h
===========
void read();  // one line only

file rLinkDef.h
===============
#ifdef __CINT__

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

#pragma link C function read;

#endif


file read.C
===========
//this is the read program which i put into a
//shared lib.

#include <TFile.h>
#include <TCanvas.h>
#include <iostream>
   
void read()
{
  TFile * tf = new TFile ("bla.root","read");
  cout << "oops"<<endl;
  TCanvas * c1 = (TCanvas *) tf->Get("canvas");	// segfault here. 
  cout << "worked."<<endl;
  c1->Draw();
}

macro bla.C creating the file with a canvas
============================================
//this is a macro which produces a root file.
//i call it interactively, in naked root.

void bla1()
{
  h=new TH2F("h","", 1,0,10,1,0,10);
  Float_t x[5]={ 1,9,2,8,3 };
  Float_t y[5]={ 1,1,2,2,7 };
  TPolyMarker pm(5,x,y);
  pm->SetMarkerStyle(22);

  h->Draw();
  pm->Draw();

  tf = new TFile ("bla.root","recreate");
  c1->Write("canvas");
  //at this point you must see an empty canvas (pm destructor has been
called)
}

run a Root session executing the above macro bla.C

run the first script at the top running rootcint, g++ and making
the shared lib myclass.so

run the following Root session
root
Root > gSystem->Load("myclass");
Root > read(); //this should work. it will display teh original canvas

Rene Brun
















J. Rieling wrote:
> 
> -----BEGIN PGP SIGNED MESSAGE-----
> 
> hi Rene,
> 
>   you wrote:
> 
> > I suspect a missing include or like in your batch program.
> > Could you send me (not the list) a copy of your small program.
> 
>   certainly.
>   i boiled the problem down to a few lines.
> 
>   please find in att.1 the following 2 files:
>   1.)  a macro mkrootfile.C
>        which creates the problematic(?) root file, and
> 
>   2.)  a C++-prg.  read.C which i translate into a
>        shared lib & use for reading.
> 
>   att.2 contains a dump of the root session where root
>   refuses to execute read.C
> 
>   att.3 contains a dump of the root session where root
>   performs the identical commands w/o problems.
> 
>   hope you can reproduce the problem :-)
>   see you & thanks for your efforts,
> 
> j"org.
> 
> __________________________________________________________________________
> dr. j. rieling  /  daimlerChrysler aerospace, orbital systems & operations
> fon +49 421 5395643      fax +49 421 5395127      joerg.rieling@ri.dasa.de
> 
> -----BEGIN PGP SIGNATURE-----
> Version: PGPfreeware 5.0i for non-commercial use
> Charset: noconv
> 
> iQCVAwUBN0GQ7zj2v2S/jY1FAQFRjAQAhurPF91kq0aK+lv+zCzewBAdQMtCMU8C
> ckMSz+kcdnpGdmapjMq5b6GEpIfvMtmdv+cP8lNVE/n1nJy7Ub9cUixGgNzrqNc3
> tX/6AM4ZaFJjRi13GGZEGNQhGlDSJImQPdZNsIaYD/8z1SZ3Iieg2HUxE4W2REgv
> xi0/I650ZMc=
> =1F34
> -----END PGP SIGNATURE-----
> 
>   ------------------------------------------------------------------------
> 
>               Name: bla1
>    bla1       Type: Plain Text (TEXT/PLAIN)
>           Encoding: BASE64
> 
>               Name: bla2
>    bla2       Type: Plain Text (TEXT/PLAIN)
>           Encoding: BASE64
> 
>               Name: bla3
>    bla3       Type: Plain Text (TEXT/PLAIN)
>           Encoding: BASE64



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:33 MET