Сборка и запуск примера на Geant4
В этом уроке разберем как собирать и запускать проект на Geant4 для Ubuntu, линукса. Для Windows разбор будет опубликован позже, однако принцип тот же самый.
Подготовка к компиляции примера на Geant4
Следует понимать, что проект или программа Geant4 работает используя его как библиотеку, берет из него необходимые классы, данные сечений, параметров частиц и так далее. Поэтому, для компиляции нужно предварительно указать где лежит Джант, и все необходимые исходные данные.
Для данного разбора возьмем установку по пути
/home/black/geant4/install_path/geant4.10.03-build
описание которой было дано ранее в этой статье.
Итак, нам нужно указать директорию, в которой компилятор сможет найти все необходимые пути
/home/black/geant4/install_path/geant4.10.03.p03-install/lib/Geant4-10.3.3
Для примера, директория другой версии Geant
/home/black/geant4/install_path/geant4.10.05-install/lib/Geant4-10.5.1
Схематично этот путь выглядит так:
install path/installed Geant4 folder/lib/Geant4-10.x.x
Создание файла CmakeLists.txt для CMAKE
Для сборки проекта используется CMAKE, это специальная утилита для автоматической сборки приложений. Она существенно упрощает сборку и компиляцию программ.
В файлах примеров с этого сайта и в примерах Geant4 присутствует файл CmakeLists.txt, который необходим для работы CMAKE. В нем присутствуют инструкции для сборки примеров. Перед сборкой убедитесь, что в системе присутствует установленный CMAKE нужной версии.
В примерах требуется CMAKE версии новее 2.6. В качестве исходника можно использовать файл из статьи о простом примере на Geant4.
При минимальной правке стоит обратить внимание только на следующие строчки из CmakeLists.txt файла:
# Расположение исходного кода и заголовочных файлов этого проекта
# Заголовочные файлы подключаются, значит что они будут показаны в
# IDE - среде разработки
file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cpp)
file(GLOB headers ${PROJECT_SOURCE_DIR}/include/*.hh)
В частности /src/*.cpp
— в какой папке в проекте находятся файлы исходного кода и их расширение, а так же /include/*.hh
— в какой директории находятся заголовочные файлы.
И строчки
# Добавление исполняемого файла и линковка его с библиотеками Geant4
add_executable(example1 example1.cpp ${sources} ${headers})
target_link_libraries(example1 ${Geant4_LIBRARIES})
где следует поменять название основного файла проекта, если у вас он отличается от example1.cpp
.
И таким образом уже сформированный файл CmakeLists.txt подойдет практически под любой проект для Джанта.
Сборка программы Geant4
Итак, немножко затронем культуру программирования, как компилировать программу с CMAKE правильно.
Пусть наш проект лежит где-то в папке example1_rus
,
для совсем новичков приведем полный путь
/home/black/geant4/projects/example1_rus
Т.е. пусть все наши проекты будут в папке
/home/black/geant4/projects/
и в дальнейшем будем работать в ней, но команды попробуем сделать все относительные, что бы не зависеть от того, где лежит проект.
Итак, важное правило программирования: директории, где находятся исходники проекта, там, где собирается проект и где он устанавливается, должны быть разными!
В статье, где описывается установка Geant4, сделано по этому принципу.
Мы пока просто учимся и устанавливать проект не будем, поэтому пока обойдемся двумя папками — исходников и сборки.
Итак, рядом с папкой, где лежат исходники, создадим папку для сборки.
- Исходники
example1_rus
- Создаем папку сборки
example1_rus-build
и в неё заходим.
В консоли команды выглядят так:
cd /home/black/geant4/projects
создаем папку
mkdir example1_rus-build
в нее заходим
cd example1_rus-build/
можем проверить что находимся в нужной папке командой
pwd
Далее собираем проект с помощью команды CMAKE
cmake -DGeant4_DIR=/home/black/geant4/install_path/geant4.10.05-install/lib/Geant4-10.3.3 ../example1_rus
где через параметр -DGeant4_DIR
передаем папку из устанвоки Geant4, в которой находятся нужные файлы для сборки проекта. Вторым параметром указываем папку с исходниками. Так как она находится на директорию выше, указываем выйти выше и зайти в папку с исходниками example1_rus
.
Далее компилируем
make
Можем компилировать в много поточном режиме
make -j4
В результате сборки появится исполняемый файл проекта — программа, про её запуск читайте далее.
Запуск программы на Geant4
Для запуска исполняемого файла необходимо задать переменные среды для Geant4.
Для этого в консоли задаем команду
source /home/black/geant4/install_path/geant4.10.03.p03-install/bin/geant4.sh
Если у вас другая версия Geant4, то схема команды
source path to Geant4 install/bin/geant4.sh
Пройдемся по основным ошибкам запуска
Не заданы переменные среды
Если просто запустить исполняемый файл — экзешник или бинарник, зачастую появится ошибка.
black@black-bycel:~/geant4/projects/example1_rus-build$ ./example1
./example1: error while loading shared libraries: libG4processes.so: cannot open shared object file: No such file or directory
Для исправления нужно указать на файл geant4.sh в папке bin/
в директории установки
source path to Geant4 install/bin/geant4.sh
Т.е. открываем консоль, выполняем команду выше, исправив путь установки Джанта на свой, и в этой же консоли запускать программу.
Что бы не нужно было постоянно задавать переменные среды, можно эту команду поместить в файл .bashrc
в родительском каталоге вашего пользователя.
У меня например в
/home/black
Имя пользователя у меня black (производная от моего ника black-bycel, что по беларуски звучит как «чорны бусел» (ударение на о и у) или по русски «чёрный аист». Это редкий вид аиста, живущего на Полесье, в глухих лесах и болотах, где людей практически нет.)
Нет внешних дополнительных данных
Иногда не до конца скачиваются дополнительные данные Geant4, необходимые для моделирования. Можно много времени потратить разбираясь в чем проблема, однако самый простой и быстрый рецепт — очищаем все содержимое папок сборки и установки Geant4. Переустанавливаем его и не забываем указать параметр -DGEANT4_INSTALL_DATA=ON
для CMAKE
.
«Мистическое» поведение программы в процессе разработки
Иногда бывает «мистическое» поведение, когда программа то не видит новые файлы, то какие то классы, или ведет себя совершенно не понятно.
Возможно это проблема в коде, но очень часто так же и результат кэширования при компиляции. Команда очистить кэш компиляции
make clean
Я бы рекомендовал ее выполнять каждый раз перед make
.
Если вы добавили новые файлы к проекту, то нужно еще раз запускать CMAKE.
Был случай, когда проект копировали в другую папку на другой компьютер и запуск CMAKE не помогал, просто поменялись все пути, а система сборки этого не видела. Вот здесь и важно правило программирования, что папка с исходными файлами и файлы компиляции находятся в разных папка. Мы просто удаляем все что находится в папке сборки, в консоли это можно сделать командой
rm -r *
где команда rm
— удалить, -r
— удалять рекурсивно, т. е. папки и все что в них тоже, *
- маска, в таком виде означает удалить все, так как подходит к любому файлу и папке. И заново собираем проект.