[ROOT] problems with compiled TMapFile app

From: Robert Michaels (rom@jlab.org)
Date: Mon Feb 09 2004 - 18:28:21 MET


Using ROOT 3.05-07 with gcc 3.2.3 on Red Hat Enterprise Linux WS release 3
and the same problem occurs with ROOT 3.10-02 (same gcc and RedHat).

My problem is with the following TMapFile example.  Although it does work
successfully as a macro run under rootn.exe, the compiled code gives an
error message and does not produce a map file. A similar problem was 
reported by Jianglai Liu in roottalk Nov 18, 2003, but with no resolution.

1. First, here is what works:

  rootn.exe
  root [0] .x hprod.cxx

  (--> Everything fine, the mapfile "hsimple.map" is created and
       contains a histogram.)

2. Here is what does NOT work -- produces no map file

  ./hprod
  Error in <TMapFile::TMapFile>: no memory mapped file capability available
  Use rootn.exe or link application against "-lNew"

  (--> But it was linked to lNew, see below.  Also $LD_LIBRARY_PATH and
   $ROOTSYS are correct.)

The question is why does the compiled version fail if I did in fact
link against "-lNew" ?  Another hint is that on another RH distribution 
(RH 8.0 with gcc 3.2.3 and the above versions of ROOT) the compiled code 
does successfully run with the same Makefile.  So, it may be difficult
to reproduce since it does work on some systems. 

Details:

Here is the successful macro "hprod.cxx"

  {  // macro version (run in rootn.exe)

  // Set the map address as per instructions (using rootn.exe)
  // http://root.cern.ch/lxr/source/base/src/TMapFile.cxx#1065
    TMapFile::SetMapAddress(0x41d92000);

    TMapFile* mfile = TMapFile::Create("hsimple.map","RECREATE", 100000,
                            "Demo memory mapped file with histograms");
  
     TH1F* hpx    = new TH1F("hpx","This is the px distribution",100,-4,4);
   
     Float_t px, py;
     int ii = 0;
     while (1) {
       gRandom->Rannor(px,py);
       hpx->Fill(px);
       if (!(ii % 100)) {
         mfile->Update(); 
         cout << "Update "<<ii<<endl;      
       }   
       ii++;
       gSystem->Sleep(40);
     }
  }


----------------
And here is the source of the compiled code (identical to macro
except for header stuff)

#include <TROOT.h>
#include <TMapFile.h>
#include <TH1.h>
#include <iostream>
#include <TRandom.h>
#include <TSystem.h>

using namespace std;
int main()
{

// Set the map address as per instructions (using rootn.exe)
// http://root.cern.ch/lxr/source/base/src/TMapFile.cxx#1065
  TMapFile::SetMapAddress(0x41d92000);

  TMapFile* mfile = TMapFile::Create("hsimple.map","RECREATE", 100000,
                            "Demo memory mapped file with histograms");
  
   TH1F* hpx    = new TH1F("hpx","This is the px distribution",100,-4,4);
   
   Float_t px, py;
   int ii = 0;
   while (1) {
     gRandom->Rannor(px,py);
     hpx->Fill(px);
     if (!(ii % 100)) {
       mfile->Update(); 
       cout << "Update "<<ii<<endl;      
     }   
     ii++;
     gSystem->Sleep(40);
   }
}


---------------------
And here is the (simplified) Makefile for the compiled code

ROOTCFLAGS    = $(shell root-config --cflags)
ROOTLIBS      = $(shell root-config --libs) 
ROOTLIBS      += $(ROOTSYS)/lib/libNew.so
ROOTGLIBS     = $(shell root-config --glibs) 
ROOTGLIBS     += $(ROOTSYS)/lib/libNew.so

CXXFLAGS      = -O -Wall -fPIC -I$(ROOTSYS)/include -g
CC = g++
OPTIM=  
CXXFLAGS +=$(ROOTCFLAGS)
LIBS = $(LIBM) $(ROOTLIBS) $(ROOTGLIBS)
hprod:   hprod.o
	$(CC) $(CXXFLAGS) -o hprod hprod.o $(LIBS)


---------------------
And here is what the compilation says (it seems "-lNew" is linked)

rm *.o ; make
g++ -O -Wall -fPIC -I/apps/root/3.05-07-gcc3.2.3/root/include -g -D_REENTRANT -I/apps/root/3.05-07-gcc3.2.3/root/include -c hprod.C
g++ -O -Wall -fPIC -I/apps/root/3.05-07-gcc3.2.3/root/include -g -D_REENTRANT -I/apps/root/3.05-07-gcc3.2.3/root/include -o hprod hprod.o  -L/apps/root/3.05-07-gcc3.2.3/root/lib -lCore -lCint -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lpthread -lm -ldl -rdynamic  /apps/root/3.05-07-gcc3.2.3/root/lib/libNew.so -L/apps/root/3.05-07-gcc3.2.3/root/lib -lCore -lCint -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lGui -lpthread -lm -ldl -rdynamic  /apps/root/3.05-07-gcc3.2.3/root/lib/libNew.so

----
thanks !
Bob Michaels
Jefferson Lab



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