* 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で使っているので書いてありますが、普段は必要ありません。