Как скомпилировать несколько файлов в ROOT - PullRequest
3 голосов
/ 22 октября 2011

Я написал программу на C ++ (с main.cpp и различными заголовочными файлами и файлами реализации), которая прекрасно компилируется под g ++.Сейчас я пытаюсь скомпилировать его в ROOT-библиотеке Cern, но я не знаю, как это сделать, так как я знаю, как компилировать файлы в ROOT, используя .L main.cpp.

. Как включить несколькофайлы в ROOT?

Ответы [ 3 ]

6 голосов
/ 12 декабря 2011

Самый надежный способ использовать ROOT (по крайней мере, исторически и в настоящее время) - игнорировать интерпретатор, кроме как для простейших исследований, и явно компилировать ваши программы на C ++ с библиотеками ROOT.Например, используйте

g++ MySource.cc `root-config --libs --cflags` -o foo

, чтобы скомпилировать исполняемый файл "foo" из одного исходного файла.Для получения дополнительной информации об этом вспомогательном сценарии запустите «root-config --help».

Многофайловые программы / библиотеки не являются чем-то особенным, если вы предоставите необходимые аргументы для указания на библиотеки и заголовки ROOT (библиотеки доступны в LD_LIBRARY_PATH во время выполнения.) Стандартные руководства C ++ объяснят этот шаг при необходимости.Вы также можете безопасно поместить это в make-файл.

На мои деньги это и проще, и надежнее, чем использование команд .L и т. Д. В интерпретаторе CINT.В прошлый раз, когда я пытался, ACLiC фактически компилировался с временной (и искаженной) версией указанного исходного файла, поэтому любые сообщения об ошибках от компилятора были практически бесполезны!

3 голосов
/ 22 ноября 2013

Я использую CMake для компиляции моих проектов на основе ROOT.Если у вас есть проектный каталог proj / и он содержит src / и bin /, вам понадобятся 3 файла CMakeList.txt, по одному в каждом каталоге.

Простой пример CMakeList.txt в основном каталоге проекта:

cmake_minimum_required(VERSION 2.6)
project (SOME_PROJ_NAME)
add_subdirectory(src)
add_subdirectory(bin)

В каталоге src / вы храните свои .h и .cxx proj.библиотечные файлы.Пример файла CMakeList.txt:

# get all the *.cxx filenames, to compile them into a lib
file(GLOB SOME_PROJ_LIB_SRCS "${PROJECT_SOURCE_DIR}/src/*.cxx")
# include ROOT library and include files
include_directories(/path/to/root/dir/include/dir)
link_directories(/path/to/root/dir/lib/dir)
# and compile src into a library
add_library(Proj_lib_name ${SOME_PROJ_LIB_SRCS})
# here, list the ROOT libraries you require
target_link_libraries(Proj_lib_name dl Core Cint RIO Net Hist Graf Graf3d Gpad Tree Rint Postscript Matrix Physics MathCore Thread Gui pthread m)

В каталоге bin / хранятся файлы .cxx вашего приложения, и в нем есть файл CMakeList.txt:

include_directories(${PROJECT_SOURCE_DIR}/src)
link_directories(${PROJECT_SOURCE_DIR}/src)
include_directories(/path/to/root/dir/include/dir)
link_directories(/path/to/root/dir/lib/dir)
add_executable(example_app.exe example_app.cxx)
target_link_libraries(example_app.exe Proj_lib_name dl Core Cint RIO Net Hist Graf Graf3d Gpad Tree Rint Postscript Matrix Physics MathCore Thread Gui pthread m)

Наконец, для компиляции ROOTНа основе кода с CMake, из исходного кода, вы создаете dir "build" в dir вашего проекта верхнего уровня, так что ваша структура dir выглядит следующим образом:

proj/
  bin/
  build/
  src/

Затем

cd build
cmake ..

Ваши двоичные файлы будут расположены в каталоге build / bin /

Надеюсь, это поможет.

0 голосов
/ 26 октября 2011

Похоже, что я просто .L <filename> для каждого файла, который я хочу, так как .L говорит ROOT "загрузить содержимое файла в память". Хотя сейчас я не очень уверен, в каком порядке загружать файлы, так как они дают мне ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...