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