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

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

** ヘッダファイル(AnapawMode.hh) [#j2037835]

 #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 [#gfa28aa3]
 #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 [#qd9657ee]
以下のようなファイルを用意しておく。
 #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 [#g7946cb3]
 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で使っているので書いてありますが、普段は必要ありません。