Include Root header to Geant4 error: Undefined symbols for architecture x86_64: "TVersionCheck::TVersionCheck(int)

Hi there
I’m writing code by changing B1 example, and I’m trying to include Root header to the Geant4, for example, to the B1EventAction. I only put the #include “TFile.h” into the B1EventAction. However, when I change CMakelist, I find there is no FindROOT.cmake in Modules, so I copy the whole folder from otherelse to my computer. Here is my CMakelist

#----------------------------------------------------------------------------

Setup the project

cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
project(B1)

#----------------------------------------------------------------------------

Find Geant4 package, activating all available UI and Vis drivers by default

You can set WITH_GEANT4_UIVIS to OFF via the command line or ccmake/cmake-gui

to build a batch mode only executable

option(WITH_GEANT4_UIVIS “Build example with Geant4 UI and Vis drivers” ON)
if(WITH_GEANT4_UIVIS)
find_package(Geant4 REQUIRED ui_all vis_all)
else()
find_package(Geant4 REQUIRED)
endif()

set(CMAKE_MODULE_PATH /usr/local/Cellar/geant4/10.5.1/lib/Geant4-10.5.1/Modules/)
find_package(ROOT REQUIRED)
include_directories(${ROOTSYS}/include)

#----------------------------------------------------------------------------

Setup Geant4 include directories and compile definitions

Setup include directory for this project

include({Geant4_USE_FILE}) include_directories({PROJECT_SOURCE_DIR}/include
{PROJECT_SOURCE_DIR}/shared/include {Geant4_INCLUDE_DIR}
${ROOT_INCLUDE_DIRS})
#----------------------------------------------------------------------------

Locate sources and headers for this project

NB: headers are included so they will show up in IDEs

file(GLOB sources {PROJECT_SOURCE_DIR}/src/*.cc {PROJECT_SOURCE_DIR}/shared/src/.cc)
file(GLOB headers {PROJECT_SOURCE_DIR}/include/*.hh {PROJECT_SOURCE_DIR}/shared/include/
.hh)

#----------------------------------------------------------------------------

Add the executable, and link it to the Geant4 libraries

add_executable(exampleB1 exampleB1.cc {sources} {headers})
target_link_libraries(exampleB1 ${Geant4_LIBRARIES})

#----------------------------------------------------------------------------

Copy all scripts to the build directory, i.e. the directory in which we

build B1. This is so that we can run the executable directly because it

relies on these scripts being in the current working directory.

set(EXAMPLEB1_SCRIPTS
exampleB1.in
exampleB1.out
init_vis.mac
run1.mac
run2.mac
vis.mac
)

foreach(_script {EXAMPLEB1_SCRIPTS}) configure_file( {PROJECT_SOURCE_DIR}/{_script} {PROJECT_BINARY_DIR}/${_script}
COPYONLY
)
endforeach()

#----------------------------------------------------------------------------

For internal Geant4 use - but has no effect if you build this

example standalone

add_custom_target(B1 DEPENDS exampleB1)

#----------------------------------------------------------------------------

Install the executable to ‘bin’ directory under CMAKE_INSTALL_PREFIX

install(TARGETS exampleB1 DESTINATION bin)

There is no error and warning when I type cmake, I did make sure that cmake is able to find the ROOTSYS. But when I type make, there are lots of warnings about TString and CLHEP, and here is error

[ 75%] Building CXX object CMakeFiles/exampleB1.dir/src/B1RunAction.cc.o
[ 87%] Building CXX object CMakeFiles/exampleB1.dir/src/B1SteppingAction.cc.o
[100%] Linking CXX executable exampleB1
Undefined symbols for architecture x86_64:
“TVersionCheck::TVersionCheck(int)”, referenced from:
___cxx_global_var_init.5 in B1EventAction.cc.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [exampleB1] Error 1
make[1]: *** [CMakeFiles/exampleB1.dir/all] Error 2
make: *** [all] Error 2

Now I have no idea about this problem. Could you please tell me what should I do to solve that? Thanks for your help.

ROOT version: v6.20.00
Geant4 version: 10.5.1
OS: MacOS 10.15.4

The error you see is clang: error: linker command failed with exit code 1 which means you did not link against the libraries of ROOT (you only included the header files). Change this line:

 target_link_libraries(exampleB1 ${Geant4_LIBRARIES} ${ROOT_LIBRARIES})

Also, note that in order to save the output of your analysis in the root file (with histograms, and ntuples) you do not need to attach ROOT to your project. Read more in the user guide or see e.g. examples B3 or B4.

1 Like