編集メニュー > 新規作成 編集 コピー 名前の変更 凍結 アップロード 添付ファイル一覧 バックアップ

rootへのクラスの追加

ライブラリ(*.so)をロードしてクラスをルートに追加するためのメモ。 微妙にはまったので。

 ヘッダファイル(AnapawMode?.hh)

#ifndef __ANAPAWMODE_HH__
#define __ANAPAWMODE_HH__
#include <TObject.h>
class AnapawMode : public TObject
{
public:
  AnapawMode();
  ~AnapawMode();
private:
  void Compro();
  void Exe_command(char* line);

  ClassDef(AnapawMode,0)
};
#endif

追加するクラスはTObjectを継承していなければならないらしい。インクルードし忘れるとClassDef?()のところでエラーを吐かれる。

 AnapawMode?.cc

#include "AnapawMode.hh"
#include "TROOT.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <readline/readline.h>
#include <readline/history.h>
ClassImp(AnapawMode)
//-----------------------------------------------------------------------
using namespace std;
AnapawMode::AnapawMode(){
  cout<<"AnapawMode START"<<endl;
  Compro();
}
AnapawMode::~AnapawMode(){
  cout<<"AnapawMode STOP"<<endl;
}
//-----------------------------------------------------------------------
void AnapawMode::Compro()
...

とこんな感じで書く。ClassImp?(AnapawMode?)はどこに書いてもよいとどこかの誰かのページに書いてあった。

 AnapawModeLinkDef?.hh

以下のようなファイルを用意しておく。

#ifdef __CINT__
#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;
#pragma link C++ class AnapawMode;
#endif

意味は全然わかっていませんよ。最後の ... class AnapawMode?;は上と共通にする必要がある。

Makefile

CPP=g++
CLASSNAME = AnapawMode
OBJS= AnapawMode.o
#-------------------------------------------------------------------------
# for ROOT class dictionary
OBJS += $(CLASSNAME)LinkDef.o
ROOT_CFLAGS :=$(shell root-config --cflags)
ROOT_LIBS   :=$(shell root-config --glibs)
READLINE= -lreadline -lcurses
CPPFLAGS += $(ROOT_CFLAGS)
LDFLAGS  += $(ROOT_LIBS) $(READLINE)
#-------------------------------------------------------------------------
all: dict $(OBJS) lib
dict:
        rootcint -f $(CLASSNAME)LinkDef.cc \
        -c $(CLASSNAME).hh $(CLASSNAME)LinkDef.hh
lib: $(OBJS)
        gcc -shared -o lib$(CLASSNAME).so *.o
clean:
        rm -f *~ *.o *.so
.cc.o:
        $(CPP) $(CPPFLAGS) -c $<

READLINEはAnapawMode?で使っているので書いてありますが、普段は必要ありません。