ROOT¶
The root tool detection script Findroot.cmake
sets the usual
cmake variables (see Tool detection/configuration) as well as
ROOTSYS
.
Using less common root components¶
Root is not just one library, it is a lot of libraries. You may want to use a library from the ROOT framework that isn’t added to the link line by default when one simply adds root to USE_TOOLS. For instance if you use something from root’s TMVA package, you might get runtime link errors like this:
***
*** Failed to load library. (exceptions.RuntimeError)
*** dlopen() dynamic loading error:
/home/mdagost/icerec_V02-02-00/build/lib/libAtmCscdL3MLPFilter.so:
undefined symbol: _ZN4TMVA6Reader7BookMVAERK7TStringS3_
***
If you run that garbled looking undefined symbol through c++filt, you’ll see:
% c++filt
_ZN4TMVA6Reader7BookMVAERK7TStringS3_
TMVA::Reader::BookMVA(TString const&, TString const&)
This symbol is inside root’s libTMVA.so
. To fix this problem you
will need to tell cmake to link libTMVA into your project’s library
explicitly. First you need to ask cmake to find the library for you.
In your project’s CMakeLists.txt:
find_library(ROOT_TMVA_LIB # variable to set, containing the library
TMVA # name of library to find, without 'lib' or '.so'
PATHS ${ROOTSYS}/lib # where to look. ROOTSYS set by root-detection script
NO_DEFAULT_PATH # in this case, only use the toolset ROOT
)
See the cmake documentation (try cmake --help-full | less
) for
find_library
for full details on this built-in cmake macro.
PATHS ${ROOTSYS}/lib
means to look for the library named TMVA in
the directory ${ROOTSYS}/lib
. NO_DEFAULT_PATH
means not to
search elsewhere (this is important… you do not want to
accidentally mix root versions, this is the single biggest source of
frustration with root). That invocation will set the cmake variable
ROOT_TMVA_LIB
to the path of the library, if found, else to
something like TMVA_NOTFOUND
.
Then tell i3_add_library to use this library:
i3_add_library(myproject
private/myproject/*.cxx
USE_TOOLS [ whatever tools you are using, including 'root' ]
USE_PROJECTS [etc]
LINK_LIBRARIES ${ROOT_TMVA_LIB}
)
With this, myproject should be linked against root’s libTMVA.so, and the rest should happen automagically.
Having made Command line configuration, you should see the setting for
ROOT_TMVA_LIB
in your CMakeCache.txt:
ROOT_TMVA_LIB:PATH=/opt/i3/ports/root-v5.18.00/lib/libTMVA.so