#背景
CERNが提供している解析ツールROOTを統合開発環境(IDE)で使いたい!と思ったのですが、日本語の情報がほとんどありません。誰かの参考になればと私の試行錯誤を残しておきます。クリスマス最高!!一番好きな休日です!!!
#環境
OSはScientific Linux 6.8、ROOTはver 5.34です。
IDEは何がいいか調べてみたところJetBrainsのものがいいという記述を見たのでCLionの最新版2016.3を選びました。学生だとタダだし。
#とりあえず試す
CLion用のディレクトリを用意して既存のコード(g++コンパイルで動作は確認済)を読み込んでみます。
ClionProjects/ROOTMacros/txt2Tree.cc:1:19: error: TROOT.h: そのようなファイルやディレクトリはありません
みたいなエラーが大量に吐き出されます。
これは-lmといったヘッダオプションなどを指定してないからです。
g++などのコンパイラでコンパイルするときには
root-config --libs --cflags
を実行することで、必要なヘッダなどのオプションが例えば
-L/home/root/lib -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d \\
-lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore \\
-lThread -pthread -lm -ldl -rdynamic -pthread -m64 -I/home/root/include
のように得られます。その出力を張り付けるなり` `で囲むなりしてg++の実行時にオプションを指定してやればいいわけです。
しかしCLionはCMakeを使ってコンパイルをしています。
そしてCMakeはCMakeLists.txt
を読み込んでオプションなどを指定します。
というわけでIntegrate ROOT into my project with CMakeを参考にCMakeLists.txt
へオプションを追加していきましょう。
#CMakeLists.txtの設定
基本的にはROOTはCMakeに対応しているのでfind_package()でROOTを読み込めば多くのオプションなどを自動で設定してくれます。
しかしここでIntegrate ROOT into my project with CMakeをそのまま参考にすると大きな落とし穴にハマります。
FindROOT.cmake
がCMake用の設定が書き込まれたファイルなのですが、これの位置はROOTのコンパイル方法によって異なります。
Configure/Makeを用いてコンパイルした場合は$ROOTSYS/etc/cmake/FindROOT.cmake
となり、CMakeでコンパイルした場合は(多分)$ROOTSYS/FindROOT.cmake
となります。
これをlist
でCMAKE_PREFIX_PATH
に読み込めと書いてありますが前者の場合は
list(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS}/etc/cmake)
を追加するだけでは完全に読み込んでくれませんでした。Treeなどを読み込んでくれないためTTreeを使おうとするとリンクに失敗します。
そこで
list(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS})
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} $ENV{ROOTSYS}/etc/cmake)
とすることでちゃんとFindROOT.cmake
を読み込んでくれるようになります。
このあとに
find_package(ROOT REQUIRED COMPONENTS RIO Net)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${ROOT_INCLUDE_DIRS})#ヘッダファイル*.hを読み込み
set(SOURCE_FILES main.cc)
add_executable(ROOTMacro ${SOURCE_FILES})
target_link_libraries(ROOTMacro ${ROOT_LIBRARIES} )#ライブラリを指定
を追加することで実行可能となります。
ちなみに最初にヘッダファイルを読み込むときはCPU使用率が100%近くになり30秒ほどかかりました。
以上の手順で自分はCLionでの開発が可能になりました。CMakeコンパイルの場合は少し違うかもしれませんが、その場合は参考サイトがそのまま当てはまるのではないでしょうか。
最後にCMakeLists.txt
の全体を掲載しておきます。
#CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(ROOTMacro)
set(CMAKE_CXX_STANDARD 11)
list(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS})
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} $ENV{ROOTSYS}/etc/cmake)
find_package(ROOT REQUIRED COMPONENTS RIO Net)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${ROOT_INCLUDE_DIRS})
set(SOURCE_FILES main.cc)
add_executable(ROOTMacro ${SOURCE_FILES})
target_link_libraries(ROOTMacro ${ROOT_LIBRARIES} )