Accessing Custom ROOT Classes

Hello,

This is a follow up to one of my earlier questions “Add Own ROOT Classes” (Add Own ROOT Classes).

My problem is that I would like to access my custom ROOT class from a directory that does not contain any of the shared library files (or any other files that ROOT creates, etc.). That was probably not a very good description, so I have made a minimal example of my problem. I am using /mnt/misc/sw/x86_64/Debian/8/root/gnu/6.04.02/bin/root.

Here are the following files I use.
This file is called A.h:


class A {

 public:
  A() : val(0) {;}
  A(int input) : val(input) {;}
  int get_val() const { return val; }

 public:
  ClassDef(A,1);

 private:
  int val;

};

This file is called A.cpp:


#include <iostream>

#include "TFile.h"
#include "TTree.h"

#include "A.h"

int main(){

  A A_object;

  TTree* t = new TTree("t","description");
  t->Branch("A", &A_object);

  for (int i=0; i<10; i++){
    A_object = A(i);
    t->Fill();
  }

  TFile* fOut = new TFile("output.root","RECREATE");
  t->Write();
  fOut->Close();

  return 0;

}

This file is LinkDef.h:


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

#pragma link C++ class A+;

And here is the build script I use:


rm A_dictionary.cxx
rootcling A_dictionary.cxx -rml libA.so -rmf libA.rootmap A.h LinkDef.h
g++ A_dictionary.cxx `root-config --libs --cflags` -o libA.so -fPIC -shared
g++ A.cpp $(root-config --cflags) $(root-config --glibs) libA.so -std=c++11 -O3 -o my_executable

I then run my_executable. This produces the intended result: a root file with a tree that was filled as I expected. Now I would like to analyze the contents of this tree. I do so with this script named analyze_tree.C (which I compile with ACLiC, using .L analyze_tree.C++g):


#include <iostream>

#include "TFile.h"
#include "TTree.h"

#include "A.h"

void analyze_tree(){

  TFile* fIn = new TFile("output.root","READ");
  TTree* tIn = (TTree*) fIn->Get("t");

  A* A_pointer = new A;

  tIn->SetBranchAddress("A", &A_pointer);

  int num = tIn->GetEntries();
  for (int i=0; i<num; i++){
    tIn->GetEntry(i);
    std::cout << A_pointer->get_val() << std::endl;
  }

}

Running this script in the same directory as all the other files produces the intended result. Now here comes my problem. I want to move analyze_tree.C to a different directory and run it from this new directory. My first step was to just change the pathways to the header file and the ROOT file, as shown here:


#include <iostream>

#include "TFile.h"
#include "TTree.h"

#include "../A.h" // ** modify path **

void analyze_tree(){

  TFile* fIn = new TFile("../output.root","READ"); // ** modify path **
  TTree* tIn = (TTree*) fIn->Get("t");

  A* A_pointer = new A;

  tIn->SetBranchAddress("A", &A_pointer);

  int num = tIn->GetEntries();
  for (int i=0; i<num; i++){
    tIn->GetEntry(i);
    std::cout << A_pointer->get_val() << std::endl;
  }

}

This returns the following error:


root [0] .L analyze_tree.C++g
Info in <TUnixSystem::ACLiC>: creating shared library /user/my_name/root_forums/new_directory/./analyze_tree_C.so
/user/my_name/root_forums/new_directory/analyze_tree_C_ACLiC_dict.o: In function `A::A()':
/user/my_name/root_forums/new_directory/./../A.h:5: undefined reference to `vtable for A'
/user/my_name/root_forums/new_directory/analyze_tree_C_ACLiC_dict.o: In function `int TTree::SetBranchAddress<A>(char const*, A**, TBranch**)':
/mnt/misc/sw/x86_64/Debian/8/root/gnu/6.04.02/include/root/TTree.h:505: undefined reference to `typeinfo for A'
/mnt/misc/sw/x86_64/Debian/8/root/gnu/6.04.02/include/root/TTree.h:507: undefined reference to `typeinfo for A'
collect2: error: ld returned 1 exit status
Error in <ACLiC>: Compilation failed!

I searched around and found some information about gSystem->Load. I tried this, and it works as intended:


root [0] gSystem->Load("../libA.so");
root [1] .L analyze_tree.C++g
Info in <TUnixSystem::ACLiC>: creating shared library /user/my_name/root_forums/new_directory/./analyze_tree_C.so
root [2] analyze_tree()
0
1
2
3
4
5
6
7
8
9

So then I thought I could put this gSystem load command into analyze_tree.C as shown here:



#include <iostream>

#include "TFile.h"
#include "TTree.h"
#include "TSystem.h" // ** I think this is the header for gSystem? **

#include "../A.h" // ** modify path **

void analyze_tree(){

  gSystem->Load("../libA.so"); // ** same command used previously **

  TFile* fIn = new TFile("../output.root","READ"); // ** modify path **
  TTree* tIn = (TTree*) fIn->Get("t");

  A* A_pointer = new A;

  tIn->SetBranchAddress("A", &A_pointer);

  int num = tIn->GetEntries();
  for (int i=0; i<num; i++){
    tIn->GetEntry(i);
    std::cout << A_pointer->get_val() << std::endl;
  }

}

But now the error is as it was before:


root [0] .L analyze_tree.C++g
Info in <TUnixSystem::ACLiC>: creating shared library /user/my_name/root_forums/new_directory/./analyze_tree_C.so
/user/my_name/root_forums/new_directory/analyze_tree_C_ACLiC_dict.o: In function `A::A()':
/user/my_name/root_forums/new_directory/./../A.h:5: undefined reference to `vtable for A'
/user/my_name/root_forums/new_directory/analyze_tree_C_ACLiC_dict.o: In function `int TTree::SetBranchAddress<A>(char const*, A**, TBranch**)':
/mnt/misc/sw/x86_64/Debian/8/root/gnu/6.04.02/include/root/TTree.h:505: undefined reference to `typeinfo for A'
/mnt/misc/sw/x86_64/Debian/8/root/gnu/6.04.02/include/root/TTree.h:507: undefined reference to `typeinfo for A'
collect2: error: ld returned 1 exit status
Error in <ACLiC>: Compilation failed!

Any help would be appreciated. I showed above one method that works: typing gSystem->Load("…/libA.so") before compiling with ACLiC. However, I would like to not have to do this, but rather somehow incorporate it into my analyze_tree.C script.

Hi,

You have two solution. Either update the shell environment variable LD_LIBRARY_PATH to contain the directory that hold the library and the rootmap file (this will enable the autoloading) or
use at the beginning of the script:

The error you use (with gSystem->Load inside the code) is due to the order of things done by cling:

  1. parse the code and eventually auto-load libraries based on rootmap file information or R__LOAD_LIBRARY
  2. compile the code
  3. link the code with the already loaded libraries
  4. execute the function.

The issue is that step 3 needs to have access to the symbol of the library but when gSystem->Load is inside the function, it is executed only at step 4 (i.e too late).

Cheers,
Philippe.

[quote=“pcanal”]Hi,

You have two solution. Either update the shell environment variable LD_LIBRARY_PATH to contain the directory that hold the library and the rootmap file (this will enable the autoloading) or
use at the beginning of the script:

The error you use (with gSystem->Load inside the code) is due to the order of things done by cling:

  1. parse the code and eventually auto-load libraries based on rootmap file information or R__LOAD_LIBRARY
  2. compile the code
  3. link the code with the already loaded libraries
  4. execute the function.

The issue is that step 3 needs to have access to the symbol of the library but when gSystem->Load is inside the function, it is executed only at step 4 (i.e too late).

Cheers,
Philippe.[/quote]

Hi Phillipe,
Thank you for your response. I tried your suggestion

but was unsuccessful. Here is the code:


R__LOAD_LIBRARY(../libA.so)

#include <iostream>

#include "TFile.h"
#include "TTree.h"
//#include "TSystem.h" // ** I think this is the header for gSystem? **

#include "../A.h" // ** modify path **

void analyze_tree(){

  //gSystem->Load("../libA.so"); // ** same command used previously **

  TFile* fIn = new TFile("../output.root","READ"); // ** modify path **
  TTree* tIn = (TTree*) fIn->Get("t");

  A* A_pointer = new A;

  tIn->SetBranchAddress("A", &A_pointer);

  int num = tIn->GetEntries();
  for (int i=0; i<num; i++){
    tIn->GetEntry(i);
    std::cout << A_pointer->get_val() << std::endl;
  }

}

And the error:


root [0] .L analyze_tree.C++g
Info in <TUnixSystem::ACLiC>: creating shared library /user/my_name/root_forums/new_directory/./analyze_tree_C.so
Warning in <TClassTable::Add>: class TApplication already in TClassTable
Warning in <TClassTable::Add>: class TApplicationImp already in TClassTable
Warning in <TClassTable::Add>: class TAttFill already in TClassTable
Warning in <TClassTable::Add>: class TAttLine already in TClassTable
Warning in <TClassTable::Add>: class TAttMarker already in TClassTable
Warning in <TClassTable::Add>: class TAttPad already in TClassTable
Warning in <TClassTable::Add>: class TAttAxis already in TClassTable
Warning in <TClassTable::Add>: class TAttText already in TClassTable
Warning in <TClassTable::Add>: class TAtt3D already in TClassTable
Warning in <TClassTable::Add>: class TAttBBox already in TClassTable
Warning in <TClassTable::Add>: class TAttBBox2D already in TClassTable
Warning in <TClassTable::Add>: class TBenchmark already in TClassTable
Warning in <TClassTable::Add>: class TBrowser already in TClassTable
Warning in <TClassTable::Add>: class TBrowserImp already in TClassTable
Warning in <TClassTable::Add>: class TBuffer already in TClassTable
Warning in <TClassTable::Add>: class TRootIOCtor already in TClassTable
Warning in <TClassTable::Add>: class TCanvasImp already in TClassTable
Warning in <TClassTable::Add>: class TColor already in TClassTable
Warning in <TClassTable::Add>: class TColorGradient already in TClassTable
Warning in <TClassTable::Add>: class TLinearGradient already in TClassTable
Warning in <TClassTable::Add>: class TRadialGradient already in TClassTable
Warning in <TClassTable::Add>: class TContextMenu already in TClassTable
Warning in <TClassTable::Add>: class TContextMenuImp already in TClassTable
Warning in <TClassTable::Add>: class TControlBarImp already in TClassTable
Warning in <TClassTable::Add>: class TInspectorImp already in TClassTable
Warning in <TClassTable::Add>: class TDatime already in TClassTable
Warning in <TClassTable::Add>: class TDirectory already in TClassTable
Warning in <TClassTable::Add>: class TEnv already in TClassTable
Warning in <TClassTable::Add>: class TEnvRec already in TClassTable
Warning in <TClassTable::Add>: class TFileHandler already in TClassTable
Warning in <TClassTable::Add>: class TGuiFactory already in TClassTable
Warning in <TClassTable::Add>: class TStyle already in TClassTable
Warning in <TClassTable::Add>: class TVirtualX already in TClassTable
Warning in <TClassTable::Add>: class TVirtualPad already in TClassTable
Warning in <TClassTable::Add>: class TVirtualViewer3D already in TClassTable
Warning in <TClassTable::Add>: class TBuffer3D already in TClassTable
Warning in <TClassTable::Add>: class TGLManager already in TClassTable
Warning in <TClassTable::Add>: class TVirtualGLPainter already in TClassTable
Warning in <TClassTable::Add>: class TVirtualGLManip already in TClassTable
Warning in <TClassTable::Add>: class TVirtualPS already in TClassTable
Warning in <TClassTable::Add>: class TGLPaintDevice already in TClassTable
Warning in <TClassTable::Add>: class TVirtualPadPainter already in TClassTable
Warning in <TClassTable::Add>: class TVirtualPadEditor already in TClassTable
Warning in <TClassTable::Add>: class TVirtualFFT already in TClassTable
Warning in <TClassTable::Add>: class __gnu_cxx::__normal_iterator<char*,string> already in TClassTable
Warning in <TClassTable::Add>: class __gnu_cxx::__normal_iterator<const char*,string> already in TClassTable
Warning in <TClassTable::Add>: class __gnu_cxx::__normal_iterator<string*,vector<string> > already in TClassTable
Warning in <TClassTable::Add>: class __gnu_cxx::__normal_iterator<const string*,vector<string> > already in TClassTable
Warning in <TClassTable::Add>: class reverse_iterator<__gnu_cxx::__normal_iterator<string*,vector<string> > > already in TClassTable
Warning in <TClassTable::Add>: class __gnu_cxx::__normal_iterator<TString*,vector<TString> > already in TClassTable
Warning in <TClassTable::Add>: class __gnu_cxx::__normal_iterator<const TString*,vector<TString> > already in TClassTable
Warning in <TClassTable::Add>: class reverse_iterator<__gnu_cxx::__normal_iterator<TString*,vector<TString> > > already in TClassTable
Warning in <TClassTable::Add>: class FileStat_t already in TClassTable
Warning in <TClassTable::Add>: class UserGroup_t already in TClassTable
Warning in <TClassTable::Add>: class SysInfo_t already in TClassTable
Warning in <TClassTable::Add>: class CpuInfo_t already in TClassTable
Warning in <TClassTable::Add>: class MemInfo_t already in TClassTable
Warning in <TClassTable::Add>: class ProcInfo_t already in TClassTable
Warning in <TClassTable::Add>: class RedirectHandle_t already in TClassTable
Warning in <TClassTable::Add>: class TExec already in TClassTable
Warning in <TClassTable::Add>: class TFolder already in TClassTable
Warning in <TClassTable::Add>: class TMacro already in TClassTable
Warning in <TClassTable::Add>: class TMD5 already in TClassTable
Warning in <TClassTable::Add>: class TMemberInspector already in TClassTable
Warning in <TClassTable::Add>: class TMessageHandler already in TClassTable
Warning in <TClassTable::Add>: class TNamed already in TClassTable
Warning in <TClassTable::Add>: class TObjString already in TClassTable
Warning in <TClassTable::Add>: class TObject already in TClassTable
Warning in <TClassTable::Add>: class TRemoteObject already in TClassTable
Warning in <TClassTable::Add>: class TPoint already in TClassTable
Warning in <TClassTable::Add>: class TProcessID already in TClassTable
Warning in <TClassTable::Add>: class TProcessUUID already in TClassTable
Warning in <TClassTable::Add>: class TProcessEventTimer already in TClassTable
Warning in <TClassTable::Add>: class TRef already in TClassTable
Warning in <TClassTable::Add>: class TROOT already in TClassTable
Warning in <TClassTable::Add>: class TRegexp already in TClassTable
Warning in <TClassTable::Add>: class TPRegexp already in TClassTable
Warning in <TClassTable::Add>: class TPMERegexp already in TClassTable
Warning in <TClassTable::Add>: class TRefCnt already in TClassTable
Warning in <TClassTable::Add>: class TSignalHandler already in TClassTable
Warning in <TClassTable::Add>: class TStdExceptionHandler already in TClassTable
Warning in <TClassTable::Add>: class TStopwatch already in TClassTable
Warning in <TClassTable::Add>: class TStorage already in TClassTable
Warning in <TClassTable::Add>: class TString already in TClassTable
Warning in <TClassTable::Add>: class TStringLong already in TClassTable
Warning in <TClassTable::Add>: class TStringToken already in TClassTable
Warning in <TClassTable::Add>: class TSubString already in TClassTable
Warning in <TClassTable::Add>: class TSysEvtHandler already in TClassTable
Warning in <TClassTable::Add>: class TSystem already in TClassTable
Warning in <TClassTable::Add>: class TSystemFile already in TClassTable
Warning in <TClassTable::Add>: class TSystemDirectory already in TClassTable
Warning in <TClassTable::Add>: class TTask already in TClassTable
Warning in <TClassTable::Add>: class TTime already in TClassTable
Warning in <TClassTable::Add>: class TTimer already in TClassTable
Warning in <TClassTable::Add>: class TQObject already in TClassTable
Warning in <TClassTable::Add>: class TQObjSender already in TClassTable
Warning in <TClassTable::Add>: class TQClass already in TClassTable
Warning in <TClassTable::Add>: class TQConnection already in TClassTable
Warning in <TClassTable::Add>: class TQCommand already in TClassTable
Warning in <TClassTable::Add>: class TQUndoManager already in TClassTable
Warning in <TClassTable::Add>: class TUUID already in TClassTable
Warning in <TClassTable::Add>: class TPluginHandler already in TClassTable
Warning in <TClassTable::Add>: class TPluginManager already in TClassTable
Warning in <TClassTable::Add>: class Event_t already in TClassTable
Warning in <TClassTable::Add>: class SetWindowAttributes_t already in TClassTable
Warning in <TClassTable::Add>: class WindowAttributes_t already in TClassTable
Warning in <TClassTable::Add>: class GCValues_t already in TClassTable
Warning in <TClassTable::Add>: class ColorStruct_t already in TClassTable
Warning in <TClassTable::Add>: class PictureAttributes_t already in TClassTable
Warning in <TClassTable::Add>: class Segment_t already in TClassTable
Warning in <TClassTable::Add>: class Point_t already in TClassTable
Warning in <TClassTable::Add>: class Rectangle_t already in TClassTable
Warning in <TClassTable::Add>: class timespec already in TClassTable
Warning in <TClassTable::Add>: class TTimeStamp already in TClassTable
Warning in <TClassTable::Add>: class TFileInfo already in TClassTable
Warning in <TClassTable::Add>: class TFileInfoMeta already in TClassTable
Warning in <TClassTable::Add>: class TFileCollection already in TClassTable
Warning in <TClassTable::Add>: class TVirtualAuth already in TClassTable
Warning in <TClassTable::Add>: class TVirtualMutex already in TClassTable
Warning in <TClassTable::Add>: class TLockGuard already in TClassTable
Warning in <TClassTable::Add>: class TRedirectOutputGuard already in TClassTable
Warning in <TClassTable::Add>: class TVirtualPerfStats already in TClassTable
Warning in <TClassTable::Add>: class TVirtualMonitoringWriter already in TClassTable
Warning in <TClassTable::Add>: class TVirtualMonitoringReader already in TClassTable
Warning in <TClassTable::Add>: class TObjectSpy already in TClassTable
Warning in <TClassTable::Add>: class TObjectRefSpy already in TClassTable
Warning in <TClassTable::Add>: class TUri already in TClassTable
Warning in <TClassTable::Add>: class TUrl already in TClassTable
Warning in <TClassTable::Add>: class TInetAddress already in TClassTable
Warning in <TClassTable::Add>: class TVirtualTableInterface already in TClassTable
Warning in <TClassTable::Add>: class TBase64 already in TClassTable
Warning in <TClassTable::Add>: class TParameter<bool> already in TClassTable
Warning in <TClassTable::Add>: class TParameter<float> already in TClassTable
Warning in <TClassTable::Add>: class TParameter<double> already in TClassTable
Warning in <TClassTable::Add>: class TParameter<int> already in TClassTable
Warning in <TClassTable::Add>: class TParameter<long> already in TClassTable
Warning in <TClassTable::Add>: class TParameter<Long64_t> already in TClassTable
Warning in <TClassTable::Add>: class TArray already in TClassTable
Warning in <TClassTable::Add>: class TArrayC already in TClassTable
Warning in <TClassTable::Add>: class TArrayD already in TClassTable
Warning in <TClassTable::Add>: class TArrayF already in TClassTable
Warning in <TClassTable::Add>: class TArrayI already in TClassTable
Warning in <TClassTable::Add>: class TArrayL already in TClassTable
Warning in <TClassTable::Add>: class TArrayL64 already in TClassTable
Warning in <TClassTable::Add>: class TArrayS already in TClassTable
Warning in <TClassTable::Add>: class TBits already in TClassTable
Warning in <TClassTable::Add>: class TCollection already in TClassTable
Warning in <TClassTable::Add>: class TBtree already in TClassTable
Warning in <TClassTable::Add>: class TBtreeIter already in TClassTable
Warning in <TClassTable::Add>: class TClassTable already in TClassTable
Warning in <TClassTable::Add>: class TClonesArray already in TClassTable
Warning in <TClassTable::Add>: class THashTable already in TClassTable
Warning in <TClassTable::Add>: class THashTableIter already in TClassTable
Warning in <TClassTable::Add>: class TIter already in TClassTable
Warning in <TClassTable::Add>: class TIterator already in TClassTable
Warning in <TClassTable::Add>: class TList already in TClassTable
Warning in <TClassTable::Add>: class TListIter already in TClassTable
Warning in <TClassTable::Add>: class THashList already in TClassTable
Warning in <TClassTable::Add>: class TMap already in TClassTable
Warning in <TClassTable::Add>: class TMapIter already in TClassTable
Warning in <TClassTable::Add>: class TPair already in TClassTable
Warning in <TClassTable::Add>: class TObjArray already in TClassTable
Warning in <TClassTable::Add>: class TObjArrayIter already in TClassTable
Warning in <TClassTable::Add>: class TObjectTable already in TClassTable
Warning in <TClassTable::Add>: class TOrdCollection already in TClassTable
Warning in <TClassTable::Add>: class TOrdCollectionIter already in TClassTable
Warning in <TClassTable::Add>: class TSeqCollection already in TClassTable
Warning in <TClassTable::Add>: class TSortedList already in TClassTable
Warning in <TClassTable::Add>: class TExMap already in TClassTable
Warning in <TClassTable::Add>: class TExMapIter already in TClassTable
Warning in <TClassTable::Add>: class TRefArray already in TClassTable
Warning in <TClassTable::Add>: class TRefArrayIter already in TClassTable
Warning in <TClassTable::Add>: class TRefTable already in TClassTable
Warning in <TClassTable::Add>: class TVirtualCollectionProxy already in TClassTable
Warning in <TClassTable::Add>: class __gnu_cxx::__normal_iterator<int*,vector<int> > already in TClassTable
Warning in <TClassTable::Add>: class __gnu_cxx::__normal_iterator<const int*,vector<int> > already in TClassTable
Warning in <TClassTable::Add>: class reverse_iterator<__gnu_cxx::__normal_iterator<int*,vector<int> > > already in TClassTable
Warning in <TClassTable::Add>: class TBits::TReference already in TClassTable
Warning in <TClassTable::Add>: class TBaseClass already in TClassTable
Warning in <TClassTable::Add>: class TClass already in TClassTable
Warning in <TClassTable::Add>: class TClassStreamer already in TClassTable
Warning in <TClassTable::Add>: class TMemberStreamer already in TClassTable
Warning in <TClassTable::Add>: class TDictAttributeMap already in TClassTable
Warning in <TClassTable::Add>: class TClassRef already in TClassTable
Warning in <TClassTable::Add>: class TClassGenerator already in TClassTable
Warning in <TClassTable::Add>: class TDataMember already in TClassTable
Warning in <TClassTable::Add>: class TOptionListItem already in TClassTable
Warning in <TClassTable::Add>: class TDataType already in TClassTable
Warning in <TClassTable::Add>: class TDictionary already in TClassTable
Warning in <TClassTable::Add>: class TEnumConstant already in TClassTable
Warning in <TClassTable::Add>: class TEnum already in TClassTable
Warning in <TClassTable::Add>: class TFunction already in TClassTable
Warning in <TClassTable::Add>: class TFunctionTemplate already in TClassTable
Warning in <TClassTable::Add>: class ROOT::TSchemaMatch already in TClassTable
Warning in <TClassTable::Add>: class ROOT::TSchemaRule already in TClassTable
Warning in <TClassTable::Add>: class ROOT::TSchemaRule::TSources already in TClassTable
Warning in <TClassTable::Add>: class ROOT::TSchemaRuleSet already in TClassTable
Warning in <TClassTable::Add>: class TGlobal already in TClassTable
Warning in <TClassTable::Add>: class TMethod already in TClassTable
Warning in <TClassTable::Add>: class TMethodArg already in TClassTable
Warning in <TClassTable::Add>: class TMethodCall already in TClassTable
Warning in <TClassTable::Add>: class TInterpreter already in TClassTable
Warning in <TClassTable::Add>: class TClassMenuItem already in TClassTable
Warning in <TClassTable::Add>: class TVirtualIsAProxy already in TClassTable
Warning in <TClassTable::Add>: class TVirtualStreamerInfo already in TClassTable
Warning in <TClassTable::Add>: class TIsAProxy already in TClassTable
Warning in <TClassTable::Add>: class TProtoClass already in TClassTable
Warning in <TClassTable::Add>: class TProtoClass::TProtoRealData already in TClassTable
Warning in <TClassTable::Add>: class TRealData already in TClassTable
Warning in <TClassTable::Add>: class TStreamerArtificial already in TClassTable
Warning in <TClassTable::Add>: class TStreamerBase already in TClassTable
Warning in <TClassTable::Add>: class TStreamerBasicPointer already in TClassTable
Warning in <TClassTable::Add>: class TStreamerLoop already in TClassTable
Warning in <TClassTable::Add>: class TStreamerBasicType already in TClassTable
Warning in <TClassTable::Add>: class TStreamerObject already in TClassTable
Warning in <TClassTable::Add>: class TStreamerObjectAny already in TClassTable
Warning in <TClassTable::Add>: class TStreamerObjectPointer already in TClassTable
Warning in <TClassTable::Add>: class TStreamerObjectAnyPointer already in TClassTable
Warning in <TClassTable::Add>: class TStreamerString already in TClassTable
Warning in <TClassTable::Add>: class TStreamerSTL already in TClassTable
Warning in <TClassTable::Add>: class TStreamerSTLstring already in TClassTable
Warning in <TClassTable::Add>: class TStreamerElement already in TClassTable
Warning in <TClassTable::Add>: class TToggle already in TClassTable
Warning in <TClassTable::Add>: class TToggleGroup already in TClassTable
Warning in <TClassTable::Add>: class TFileMergeInfo already in TClassTable
Warning in <TClassTable::Add>: class TListOfFunctions already in TClassTable
Warning in <TClassTable::Add>: class TListOfFunctionsIter already in TClassTable
Warning in <TClassTable::Add>: class TListOfFunctionTemplates already in TClassTable
Warning in <TClassTable::Add>: class TListOfDataMembers already in TClassTable
Warning in <TClassTable::Add>: class TListOfEnums already in TClassTable
Warning in <TClassTable::Add>: class TListOfEnumsWithLock already in TClassTable
Warning in <TClassTable::Add>: class TListOfEnumsWithLockIter already in TClassTable
Warning in <TClassTable::Add>: class TUnixSystem already in TClassTable
Error in <TExMap::Add>: key 47057976 is not unique
Warning in <TClassTable::Add>: class TThread already in TClassTable
Warning in <TClassTable::Add>: class TConditionImp already in TClassTable
Warning in <TClassTable::Add>: class TCondition already in TClassTable
Warning in <TClassTable::Add>: class TMutex already in TClassTable
Warning in <TClassTable::Add>: class TMutexImp already in TClassTable
Warning in <TClassTable::Add>: class TPosixCondition already in TClassTable
Warning in <TClassTable::Add>: class TPosixMutex already in TClassTable
Warning in <TClassTable::Add>: class TPosixThread already in TClassTable
Warning in <TClassTable::Add>: class TPosixThreadFactory already in TClassTable
Warning in <TClassTable::Add>: class TSemaphore already in TClassTable
Warning in <TClassTable::Add>: class TThreadFactory already in TClassTable
Warning in <TClassTable::Add>: class TThreadImp already in TClassTable
Warning in <TClassTable::Add>: class TRWLock already in TClassTable
Warning in <TClassTable::Add>: class TAtomicCount already in TClassTable
Error in <TExMap::Add>: key 13421456 is not unique
Warning in <TClassTable::Add>: class TBufferFile already in TClassTable
Warning in <TClassTable::Add>: class TDirectoryFile already in TClassTable
Warning in <TClassTable::Add>: class TFile already in TClassTable
Warning in <TClassTable::Add>: class TFileCacheRead already in TClassTable
Warning in <TClassTable::Add>: class TFileCacheWrite already in TClassTable
Warning in <TClassTable::Add>: class TFileMerger already in TClassTable
Warning in <TClassTable::Add>: class TFree already in TClassTable
Warning in <TClassTable::Add>: class TKey already in TClassTable
Warning in <TClassTable::Add>: class TKeyMapFile already in TClassTable
Warning in <TClassTable::Add>: class TMapFile already in TClassTable
Warning in <TClassTable::Add>: class TMapRec already in TClassTable
Warning in <TClassTable::Add>: class TMemFile already in TClassTable
Warning in <TClassTable::Add>: class TArchiveFile already in TClassTable
Warning in <TClassTable::Add>: class TArchiveMember already in TClassTable
Warning in <TClassTable::Add>: class TZIPFile already in TClassTable
Warning in <TClassTable::Add>: class TZIPMember already in TClassTable
Warning in <TClassTable::Add>: class TLockFile already in TClassTable
Warning in <TClassTable::Add>: class TStreamerInfo already in TClassTable
Warning in <TClassTable::Add>: class TCollectionProxyFactory already in TClassTable
Warning in <TClassTable::Add>: class TEmulatedCollectionProxy already in TClassTable
Warning in <TClassTable::Add>: class TEmulatedMapProxy already in TClassTable
Warning in <TClassTable::Add>: class TGenCollectionProxy already in TClassTable
Warning in <TClassTable::Add>: class TGenCollectionProxy::Value already in TClassTable
Warning in <TClassTable::Add>: class TGenCollectionProxy::Method already in TClassTable
Warning in <TClassTable::Add>: class TCollectionStreamer already in TClassTable
Warning in <TClassTable::Add>: class TCollectionClassStreamer already in TClassTable
Warning in <TClassTable::Add>: class TCollectionMemberStreamer already in TClassTable
Warning in <TClassTable::Add>: class TVirtualObject already in TClassTable
Warning in <TClassTable::Add>: class TVirtualArray already in TClassTable
Warning in <TClassTable::Add>: class TFPBlock already in TClassTable
Warning in <TClassTable::Add>: class TFilePrefetch already in TClassTable
Warning in <TClassTable::Add>: class TStreamerInfoActions::TConfiguredAction already in TClassTable
Warning in <TClassTable::Add>: class TStreamerInfoActions::TActionSequence already in TClassTable
Warning in <TClassTable::Add>: class TStreamerInfoActions::TConfiguration already in TClassTable
/user/my_name/root_forums/new_directory/analyze_tree_C_ACLiC_dict.o: In function `A::A()':
/user/my_name/root_forums/new_directory/./../A.h:5: undefined reference to `vtable for A'
/user/my_name/root_forums/new_directory/analyze_tree_C_ACLiC_dict.o: In function `int TTree::SetBranchAddress<A>(char const*, A**, TBranch**)':
/mnt/misc/sw/x86_64/Debian/8/root/gnu/6.04.02/include/root/TTree.h:505: undefined reference to `typeinfo for A'
/mnt/misc/sw/x86_64/Debian/8/root/gnu/6.04.02/include/root/TTree.h:507: undefined reference to `typeinfo for A'
collect2: error: ld returned 1 exit status
Error in <ACLiC>: Compilation failed!

Any help would be appreciated.

Hi,

Then we must not be supporting (yet?) path in R__LOAD_LIBRARY, i’ll have to check.

That leaves you with set LD_LIBRARY_PATH.

Cheers,
Philippe.

[quote=“pcanal”]Hi,

Then we must not be supporting (yet?) path in R__LOAD_LIBRARY, i’ll have to check.

That leaves you with set LD_LIBRARY_PATH.

Cheers,
Philippe.[/quote]

Thanks, Phillipe.
I will try that then. If you do not find out anything new after checking about R__LOAD_LIBRARY, you can consider this topic “solved.”

Hi Erdrick,

As far as I can tell

R__LOAD_LIBRARY(../libA.so)

works (it works for me at least).

However, I did not read your report carefully enough:

root [0] .L analyze_tree.C++g
Info in <TUnixSystem::ACLiC>: creating shared library /user/my_name/root_forums/new_directory/./analyze_tree_C.so
Warning in <TClassTable::Add>: class TApplication already in TClassTable

Means that rather than interpreting the script, you are compiling it with ACLiC. We do not yet support R__LOAD_LIBRARY in ACliC. I.e.

root [0] .L analyze_tree.C

should work.

For ACLiC, you indeed need to set the LD_LIBRARY_PATH.

Cheers,
Philippe.

1 Like

See https://sft.its.cern.ch/jira/browse/ROOT-8687 to follow up.

Thank you, Philippe.