DICOM example with DCMTK errors during compilation

Good day to you all,

I am trying to use DCMTK in order to read other DICOM files with the DICOM example. First off, I still do not understand how to properly set environment variable DICOM_USE_DCMTK to ON as my terminal command are simply ignored by cmake… I had to edit the CMakeList.txt file by writing

set(DICOM_USE_DCMTK ON)

at the beginning.

Once this is done, I am getting some interesting results:

-- DICOM: Using DCMTK
-- Trying to find DCMTK expecting DCMTKConfig.cmake
-- Trying to find DCMTK expecting DCMTKConfig.cmake - failed
-- Trying to find DCMTK relying on FindDCMTK.cmake
-- Found DCMTK: /home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5-install/usr/local/include/dcmtk/config  
-- Trying to find DCMTK relying on FindDCMTK.cmake - ok
-- Trying to find DCMTK expecting DCMTKConfig.cmake
-- Trying to find DCMTK expecting DCMTKConfig.cmake - failed
-- Trying to find DCMTK relying on FindDCMTK.cmake
-- Found DCMTK: /home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5-install/usr/local/include/dcmtk/config  
-- Trying to find DCMTK relying on FindDCMTK.cmake - ok
-- DICOM settings:
   - DICOM_USE_DCMTK: ON
   - DICOM_USE_HEAD: OFF
-- Configuring done
-- Generating done
-- Build files have been written to: /home/strangesyd/Documents/ULB/MA2/MFE/Code/DICOM_simulation/DICOM-build
Scanning dependencies of target dicomReader
[  5%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamCompensator.cc.o
[  8%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamBlock.cc.o
[  5%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeam.cc.o
[ 10%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamControlPoint.cc.o
[ 13%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamDevice.cc.o
[ 16%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamWedge.cc.o
[ 18%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamDeviceRef.cc.o
[ 21%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamDevicePos.cc.o
[ 24%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFileCT.cc.o
[ 27%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFileMgr.cc.o
[ 29%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFilePET.cc.o
[ 32%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFilePlan.cc.o
[ 35%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFileStructure.cc.o
[ 37%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomROI.cc.o
[ 40%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomROIContour.cc.o
[ 43%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomVBeamDevice.cc.o
[ 45%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomVFile.cc.o
[ 48%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomVFileImage.cc.o
[ 51%] Linking CXX shared library libdicomReader.so
/usr/bin/ld: /home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5-install/usr/local/lib/libdcmdata.a(dcchrstr.cc.o): relocation R_X86_64_PC32 against symbol `_ZTV13DcmCharString' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
dicomReader/CMakeFiles/dicomReader.dir/build.make:604: recipe for target 'dicomReader/libdicomReader.so' failed

As you can see, I got DCMTK from the github page and placed it in a custom directory where I built and installed it. However, it seems like there is a problem with libdicomReader.so and I suspect it is trying to find a file where it should not… Although I have absolutely no idea what all of this means.

Each time I want to execute the example, I run a .sh file which contains these instructions:

source ../../packages/geant4.10.06.p02-install/bin/geant4.sh
export CMAKE_PREFIX_PATH=/home/strangesyd/Documents/ULB/MA2/MFE/packages/geant4.10.06.p02-install
export G4INSTALL=${CMAKE_PREFIX_PATH}
export DCMTK_BASE_DIR=/home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5-install
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${DCMTK_BASE_DIR}/lib
export DICOM_USE_DCMTK=ON
export DCMDICTPATH=/home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5/dcmdata/data/
cd DICOM-build/
cmake -DGeant4_DIR=${CMAKE_PREFIX_PATH}/lib/Geant4-10.6.2 -DDCMTK_DIR=${DCMTK_BASE_DIR} ../DICOM/
# cmake -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} ../DICOM/
make -j8
./DICOM

Frankly, I have no idea if the environment variables are really definitely set by these commands. The fact that cmake simply ignores “export DICOM_USE_DCMTK=ON” makes me unsure of it.

I am sorry for these silly questions… I never received any formation in cmake and G4 and I am trying to make sense out of it.

Can somebody help me? Thank you in advance !

On the environment variable for DICOM_USE_DCMTK, exporting it before running cmake as you do in your script should be sufficient, or the example should accept

$ cmake -DDICOM_USE_DCMTK=ON` ...

when configuring. Regarding the error:

It looks like the DCMTK static library is built without the -fPIC flag which means it can’t be linked to a shared library (libdicomReader.so in this case). To resolve this, you’ll either need to build/install DCMTK with shared libraries or modify the DICOM example CMake scripts to build full static. As that’s a reasonably extensive modification, I’d try building+installing a shared version of DCMTK first. If that fails, we can look at the modification.

Thank you very much for your help.

Adding the cmake option solved the environment variable problem, so that’s a significant improvement. :smile:

Regarding DCMTK, I erased the previous built and rebuilt everything in directory dcmtk-3.6.5-build using this command:

cmake -fPIC ../dcmtk-3.6.5

Then, using ccmake -fPIC ../dcmtk-3.6.5, I changed the value of BUILD_SHARED_LIBS to ON. After make and make DESTDIR=../dcmtk-3.6.5-install install, I reloaded the example and got a change in the output:

-- DICOM: Using DCMTK
-- Trying to find DCMTK expecting DCMTKConfig.cmake
-- Trying to find DCMTK expecting DCMTKConfig.cmake - failed
-- Trying to find DCMTK relying on FindDCMTK.cmake
-- Found DCMTK: /home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5-install/usr/local/include/dcmtk/config  
-- Trying to find DCMTK relying on FindDCMTK.cmake - ok
-- Trying to find DCMTK expecting DCMTKConfig.cmake
-- Trying to find DCMTK expecting DCMTKConfig.cmake - failed
-- Trying to find DCMTK relying on FindDCMTK.cmake
-- Found DCMTK: /home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5-install/usr/local/include/dcmtk/config  
-- Trying to find DCMTK relying on FindDCMTK.cmake - ok
-- DICOM settings:
   - DICOM_USE_DCMTK: ON
   - DICOM_USE_HEAD: OFF
-- Configuring done
-- Generating done
-- Build files have been written to: /home/strangesyd/Documents/ULB/MA2/MFE/Code/DICOM_simulation/DICOM-build
Scanning dependencies of target dicomReader
[  8%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeam.cc.o
[  8%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamBlock.cc.o
[  8%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamCompensator.cc.o
[ 10%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamControlPoint.cc.o
[ 13%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamDevice.cc.o
[ 16%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamDevicePos.cc.o
[ 18%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamDeviceRef.cc.o
[ 21%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamWedge.cc.o
[ 24%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFileCT.cc.o
[ 27%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFileMgr.cc.o
[ 29%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFilePET.cc.o
[ 32%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFilePlan.cc.o
[ 35%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFileStructure.cc.o
[ 37%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomROI.cc.o
[ 40%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomROIContour.cc.o
[ 43%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomVBeamDevice.cc.o
[ 45%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomVFile.cc.o
make[2]: *** No rule to make target '/home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5-install/usr/local/lib/libdcmpstat.a', needed by 'dicomReader/libdicomReader.so'.  Stop.
make[2]: *** Waiting for unfinished jobs....
[ 48%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomVFileImage.cc.o
CMakeFiles/Makefile2:160: recipe for target 'dicomReader/CMakeFiles/dicomReader.dir/all' failed
make[1]: *** [dicomReader/CMakeFiles/dicomReader.dir/all] Error 2
Makefile:129: recipe for target 'all' failed
make: *** [all] Error 2
/home/strangesyd/Documents/ULB/MA2/MFE/Code/DICOM_simulation/exe.sh: line 11: ./DICOM: No such file or directory

Is it a progress? The problem seems only to be displaced in the end…

There’re two possible issues here. The first, and most likely, is that CMake has cached the use of libdcmpstat.a and other DCMTK libraries. That can be quickly checked by simply deleting the contents of the directory where you are building the DICOM example, then trying to rebuild.

If the error persists, then it’s more likely an issue with the DCMTK install. The cmake invocations you used look fine to me, except that to build static libs with -fPIC the better solution is:

$ cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON <otherargs>

That should add -fPIC to the compilation of any static lib unless DCMTK’s scripts do something odd.

Thank you again !

I rebuilt the DICOM example and added the -DCMAKE_POSITION_INDEPENDENT_CODE=ON. The changes are significant: it seems that the building rules of the cmake files work but there is an error with a shared library:

-- DICOM: Using DCMTK
-- Trying to find DCMTK expecting DCMTKConfig.cmake
-- Trying to find DCMTK expecting DCMTKConfig.cmake - ok
-- Trying to find DCMTK expecting DCMTKConfig.cmake
-- Trying to find DCMTK expecting DCMTKConfig.cmake - ok
-- DICOM settings:
   - DICOM_USE_DCMTK: ON
   - DICOM_USE_HEAD: OFF
-- Configuring done
-- Generating done
-- Build files have been written to: /home/strangesyd/Documents/ULB/MA2/MFE/Code/DICOM_simulation/DICOM-build
Scanning dependencies of target dicomReader
[  2%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeam.cc.o
[  5%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamBlock.cc.o
[  8%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamCompensator.cc.o
[ 10%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamControlPoint.cc.o
[ 13%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamDevice.cc.o
[ 16%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamDevicePos.cc.o
[ 18%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamWedge.cc.o
[ 21%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomBeamDeviceRef.cc.o
[ 24%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFileCT.cc.o
[ 27%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFileMgr.cc.o
[ 29%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFilePET.cc.o
[ 32%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFilePlan.cc.o
[ 35%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomFileStructure.cc.o
[ 37%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomROI.cc.o
[ 40%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomROIContour.cc.o
[ 43%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomVBeamDevice.cc.o
[ 45%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomVFile.cc.o
[ 48%] Building CXX object dicomReader/CMakeFiles/dicomReader.dir/src/DicomVFileImage.cc.o
[ 51%] Linking CXX shared library libdicomReader.so
[ 51%] Built target dicomReader
Scanning dependencies of target DICOM-library
[ 54%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomActionInitialization.cc.o
[ 56%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomEventAction.cc.o
[ 59%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomIntersectVolume.cc.o
[ 64%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomNestedPhantomParameterisation.cc.o
[ 64%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomNestedParamDetectorConstruction.cc.o
[ 70%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomDetectorConstruction.cc.o
[ 70%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomPartialDetectorConstruction.cc.o
[ 72%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomHandler.cc.o
[ 75%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomPhantomParameterisationColour.cc.o
[ 78%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomPhantomZSliceHeader.cc.o
[ 81%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomPhantomZSliceMerged.cc.o
[ 83%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomPrimaryGeneratorAction.cc.o
[ 86%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomRegularDetectorConstruction.cc.o
[ 89%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomRun.cc.o
[ 91%] Building CXX object CMakeFiles/DICOM-library.dir/src/DicomRunAction.cc.o
[ 94%] Linking CXX shared library libDICOM.so
[ 94%] Built target DICOM-library
Scanning dependencies of target DICOM
[ 97%] Building CXX object CMakeFiles/DICOM.dir/DICOM.cc.o
[100%] Linking CXX executable DICOM
[100%] Built target DICOM
./DICOM: error while loading shared libraries: libdcmimgle.so.15: cannot open shared object file: No such file or directory

I believe we are converging towards a solution. Here is my procedure:

First rebuild DCMTK with

cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON ../dcmtk-3.6.5
ccmake ../dcmtk-3.6.5
make -j8
sudo make DESTDIR=../dcmtk-3.6.5-install install

The ccmake call is there to set BUILD_SHARED_LIBS to ON. Then the DICOM example is rebuilt using

source ../../packages/geant4.10.06.p02-install/bin/geant4.sh
export CMAKE_PREFIX_PATH=/home/strangesyd/Documents/ULB/MA2/MFE/packages/geant4.10.06.p02-install
export G4INSTALL=${CMAKE_PREFIX_PATH}
export DCMTK_BASE_DIR=/home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5-install
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${DCMTK_BASE_DIR}/lib
export DCMDICTPATH=/home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5/dcmdata/data/
cd DICOM-build/
cmake -DGeant4_DIR=${CMAKE_PREFIX_PATH}/lib/Geant4-10.6.2 -DDCMTK_DIR=${DCMTK_BASE_DIR}/usr/local/ -DDICOM_USE_DCMTK=ON ../DICOM/
make -j8
./DICOM

Any idea? I believe the error is silly…

Once again, a thousands thanks for your kind help.

I solved the problem. For those who would be interested in a my solution, here is the bash procedure:

source ../../packages/geant4.10.06.p02-install/bin/geant4.sh
export CMAKE_PREFIX_PATH=/home/strangesyd/Documents/ULB/MA2/MFE/packages/geant4.10.06.p02-install
export G4INSTALL=${CMAKE_PREFIX_PATH}
export DCMTK_BASE_DIR=/home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5-install
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${DCMTK_BASE_DIR}/usr/local/lib
export DCMDICTPATH=/home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5/dcmdata/data/
cd DICOM-build/|| exit
cmake -DLD_LIBRARY_PATH=${LD_LIBRARY_PATH} -DGeant4_DIR=${CMAKE_PREFIX_PATH}/lib/Geant4-10.6.2 -DDCMTK_DIR=${DCMTK_BASE_DIR}/usr/local/ -DDICOM_USE_DCMTK=ON -DDICOM_USE_HEAD=OFF ../DICOM/
make -j8
./DICOM

The problem was solved by adding the LD_LIBRARY_PATH tag to the cmake options.

One thing to notice about this example is that the run manager sets a limit to the number of elements that are displayed. If you do not see your DICOM image appear entirely, reset this limit in the session (Qt window) by doing

/vis/ogl/set/displayListLimit <your value>
/vis/viewer/rebuild

I still have a small error during compilation that indicates that DCMTK does not find all its libraries:

-- DICOM: Using DCMTK
-- Trying to find DCMTK expecting DCMTKConfig.cmake
-- Trying to find DCMTK expecting DCMTKConfig.cmake - ok
-- Trying to find DCMTK expecting DCMTKConfig.cmake
-- Trying to find DCMTK expecting DCMTKConfig.cmake - ok
-- DICOM settings:
   - DICOM_USE_DCMTK: ON
   - DICOM_USE_HEAD: OFF
-- Configuring done
-- Generating done
-- Build files have been written to: /home/strangesyd/Documents/ULB/MA2/MFE/Code/DICOM_simulation/DICOM-build
[ 51%] Built target dicomReader
[ 94%] Built target DICOM-library
[100%] Built target DICOM
Available UI session types: [ Qt, GAG, tcsh, csh ]
E: DcmDataDictionary: Cannot open file: /home/strangesyd/Documents/ULB/MA2/MFE/packages/dcmtk-3.6.5/dcmdata/data/

Thank you again for your very kind help. Now I can focus on something else :slight_smile:

hello everyone
i still have some problem about DICOM with DCMTK error, the system is ubuntu 20.05, geant4.10.7 and dcmtk3.6.5. the error is shown below :

!
what should I do, any idea ?
thanks first !!!