Hi all!
I have the following piece of code:
#include <iostream>
#include <vector>
#include <string>
#include "Math/Vector3D.h"
#include "TGraphErrors.h"
#include "TF1.h"
#include "TString.h"
#include "TROOT.h"
#include "TH1F.h"
#include "TCanvas.h"
#include "TGeoManager.h"
#include "TVirtualGeoTrack.h"
#include <TParticle.h>
#include "TPolyLine3D.h"
#include <TGeoTrack.h>
#include "TGeoTube.h"
#include "TGeoHelix.h"
#include "TView.h"
#include "TSystem.h"
#include "TString.h"
using namespace std;
int test(){
TCanvas* canvas = new TCanvas();
new TGeoManager("test", "test");
TGeoMaterial* material = new TGeoMaterial("Vaccum", 0,0,0);
TGeoMedium* medium = new TGeoMedium("Vaccum",1,material);
TGeoVolume* top = gGeoManager->MakeBox("TOP", medium, 4000, 4000, 4000);
gGeoManager->SetTopVolume(top);
TGeoVolume* vol = gGeoManager->MakeTube("TUBE",medium, 1790.,1800.,2350.);
vol->SetLineWidth(2);
top->AddNode(vol,1);
TGeoTrack* track = new TGeoTrack();
int nHits = 220;
double scale = M_PI/nHits;
for(int i=0; i < nHits; ++i){
track->AddPoint(5.*std::cos(i*scale), 5.*std::sin(i*scale), i*scale, i);
}
// top->AddNode(track, 2);
gGeoManager->AddTrack(track);
gGeoManager->CloseGeometry();
top->Draw();
track->Draw();
TView *view = gPad->GetView();
view->ShowAxis();
return 0;
}
Running it as root test.cpp
works fine.
However I want to use this logic inside bigger program which I compile using cmake…
And I cannot understand how to make this work…
My CMakeLists.txt
looks like this:
cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
cmake_policy(VERSION 3.12)
project(SETAnalysis VERSION 1.0)
# -03 compiler optimization for speed
# -O0 disable for valgrind debugging
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -g -Wno-effc++")
include_directories(${PROJECT_SOURCE_DIR}/include)
add_library(${PROJECT_NAME} SHARED ${PROJECT_SOURCE_DIR}/src/SETAnalysis.cpp)
### DEPENDENCIES ###
include($ENV{ILCSOFT}/ILCSoft.cmake)
find_package(ILCUTIL REQUIRED COMPONENTS ILCSOFT_CMAKE_MODULES)
include(ilcsoft_default_settings)
find_package(ROOT REQUIRED COMPONENTS Geom Physics)
find_package(Marlin 1.15 REQUIRED)
find_package(MarlinUtil 1.4 REQUIRED)
find_package(MarlinTrk REQUIRED)
FOREACH(pkg ROOT Marlin MarlinUtil MarlinTrk )
include_directories(${${pkg}_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${${pkg}_LIBRARIES})
ENDFOREACH()
install(TARGETS ${PROJECT_NAME} DESTINATION ${PROJECT_SOURCE_DIR}/lib)
And it returns undefined reference
error during compilation
/cvmfs/sft.cern.ch/lcg/releases/binutils/2.34-990b2/x86_64-centos7/bin/ld: CMakeFiles/SETAnalysis.dir/src/SETAnalysis.cpp.o: in function `SETAnalysis::drawTrack(EVENT::Track*)':
/cvmfs/ilc.desy.de/sw/x86_64_gcc82_centos7/root/6.18.04/include/TObject.h:152: undefined reference to `TGeoTrack::TGeoTrack()'
collect2: error: ld returned 1 exit status
make[2]: *** [lib/libSETAnalysis.so] Error 1
make[1]: *** [CMakeFiles/SETAnalysis.dir/all] Error 2
make: *** [all] Error 2
I have tried to do simpier task and compiler without cmake
but raw g++
with:
g++ test.cpp
root-config --cflags --glibs -lGeom
but it outputs me something similar but different:
/cvmfs/sft.cern.ch/lcg/releases/binutils/2.34-990b2/x86_64-centos7/bin/ld: /lib/../lib64/crt1.o: in function `_start':
(.text+0x20): undefined reference to `main'
/cvmfs/sft.cern.ch/lcg/releases/binutils/2.34-990b2/x86_64-centos7/bin/ld: /tmp/ccwsvOlX.o: in function `test()':
test.cpp:(.text+0x19d): undefined reference to `TGeoTrack::TGeoTrack()'
collect2: error: ld returned 1 exit status
Could anyone help how one should use these? Thanks!
ROOT Version: 6.18.04, but g++
failed with 6.24.00 as well
Platform: Centos7
Compiler: g++ 8.2 / 10.1