2016-06-01 11 views
0

私はC++で書いたシンプルなコードをmakeを使ってコンパイルします。 コンパイル時にエラーは発生しません。しかし、私はそれを実行したとき、私はstd::vector< std::vector<short> >によって引き起こされるエラーを取得し、エラー以下を参照してください。クラスの辞書を生成する方法(ベクトル<ベクトル<short>>)

Error in <TTree::SetBranchAddress> : Unable to determine the type given for the address for "apv_q". The class expected (vector<vector<short> >) refers to an stl collection and do not have a compiled CollectionProxy. Please generate the dictionary for this class (vector<vector<short> >)

TTree::SetBranchAddress

apv_qがstd::vector< std::vector<short> > *apv_q;

私はのように定義されたCERN-ROOTフレームワークからの方法であり、辞書を生成することに慣れていないので、私はオンラインで検索し、ヘッダーファイルに以下の行を追加する提案を見つけました。

しかし、それは動作しません!

私はこの問題を解決するためにあなたの助けが必要です、助けてください!

ありがとうございます!あなたが含まれているLinkDef.h含め、root-cintを実行し、それをあなたのヘッダファイルのリストを与える必要があり

 CONFIG=root-config 
     CXXFLAGS=$(shell $(CONFIG) --cflags) 
     LIBS=$(shell $(CONFIG) --glibs) 
     LDFLAGS=$(shell $(CONFIG) --ldflags) 
     CXX=g++ 
     ADDCXXFLAGS=-ggdb -O0 -std=c++0x 

     HDRS= ./Settings.h ./HitMaker.h 

     HITMAKEROBJS= HitMaker.o 

     all: hitmaker 

     hitmaker: $(HITMAKEROBJS) 
       $(CXX) -o [email protected] $(CXXFLAGS) $(ADDCXXFLAGS) $(HITMAKEROBJS) $(LDFLAGS) $(LIBS) 

     %.o: %.cc $(HDRS) 
       $(CXX) $(CXXFLAGS) $(ADDCXXFLAGS) -c $< 

答えて

0

乾杯、

江田は

関連する場合は、以下の私のメイクファイルであります線

#pragma link C++ class vector<short> +; 
#pragma link C++ class vector<vector<short> >+; 

これはツールは、コンパイルしてプロジェクトにリンクできるソースファイルを作成します。

このタスクをMakefileに含めることができます。使用する場合は、CMakeで使用できるマクロがあります(FindRoot.cmakeを検索します)。マクロROOT_GENERATE_DICTIONARYが含まれています。

EDIT:それは私の作品、私は

rootcint -f bla.cc -c HitMaker.h LinkDef.h 

を実行し、Makefileで

HITMAKEROBJS=HitMaker.o bla.o 

を追加したとき、私は

TFile file("test.root", "RECREATE"); 
TTree tree("tree", "treetitle"); 
std::vector<std::vector<short>> test; 
std::vector<short> test2; 
test2.push_back(1); 
test.push_back(test2); 
tree.Branch("test", &test); 
tree.Fill(); 
tree.Write(); 

とルート・ファイルを作成し、戻ってそれを読んで

TFile file("test.root"); 
TTree* t= NULL; 
file.GetObject("tree", t); 
std::vector<std::vector<short>>* test = NULL; 
t->SetBranchAddress("test", &test); 
t->GetEvent(0); 
std::cout << test->front().front() << std::endl; 

1がstdoutに書き込まれます。

+0

BTW、ROOTには独自の[コンテナクラス](https://root.cern.ch/doc/master/classTArrayS.html)がありますので、 'std :: vector'の代わりに使用することもできます –

+0

ありがとうございますが、私はより多くの質問があります。さて、私はrootcintをチェックし、 'rootcint -f bla.cc -c HitMaker.h LinkDef.h'を実行しました。期待どおりにbla.ccとbla.hが作成されました。私はコンパイルと混同しています。 'HDRS = $(HDIR)/Settings.h $(HDIR)/HitMaker.h $(HDIR)/ blaに変更しました。h ' ' HITMAKEROBJS = HitMaker.o' でも同じエラーが出ます。 bla.oをHITMAKEROBJSに追加すると、変数の多重定義について不平を言います。 どうすればよいですか? –

+0

使用しているルートのバージョンは?私はDebian 8に5.34を持っています。 –

関連する問題