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

Please read tips for efficient and successful posting and posting code

ROOT Version: Not Provided
Platform: Not Provided
Compiler: Not Provided

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)


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)
find_package(Geant4 REQUIRED ui_all vis_all)
find_package(Geant4 REQUIRED)

set(CMAKE_MODULE_PATH /usr/local/Cellar/geant4/10.5.1/lib/Geant4-10.5.1/Modules/)
find_package(ROOT REQUIRED)


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}

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/


Add the executable, and link it to the Geant4 libraries

add_executable(exampleB1 {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.


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


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/
[ 87%] Building CXX object CMakeFiles/exampleB1.dir/src/
[100%] Linking CXX executable exampleB1
Undefined symbols for architecture x86_64:
“TVersionCheck::TVersionCheck(int)”, referenced from:
___cxx_global_var_init.5 in
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

I guess, in addition to linking your executable to the Geant4 libraries, you now need to link it to the ROOT libraries, too.

Thanks for reply. But I stil don’t know which file I should modify. cmake or makefile? I don’t know much about link.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.