last-modified: 2019-04-28 (日) 18:36:58 (1835d)[変更箇所]
ライブラリ(*.so)をロードしてクラスをルートに追加するためのメモ。 微妙にはまったので。
#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?()のところでエラーを吐かれる。
#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?)はどこに書いてもよいとどこかの誰かのページに書いてあった。
以下のようなファイルを用意しておく。
#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?;は上と共通にする必要がある。
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?で使っているので書いてありますが、普段は必要ありません。