我编写了一个 C++ 程序(带有main.cpp
. 和各种头文件和实现文件),它在 g++ 下编译得很好。现在我正在尝试在 Cern 的 ROOT 库中编译它,但我不知道如何编译,因为我知道如何在 ROOT 中编译文件的唯一方法是使用.L main.cpp
.
如何在 ROOT 中包含多个文件?
我编写了一个 C++ 程序(带有main.cpp
. 和各种头文件和实现文件),它在 g++ 下编译得很好。现在我正在尝试在 Cern 的 ROOT 库中编译它,但我不知道如何编译,因为我知道如何在 ROOT 中编译文件的唯一方法是使用.L main.cpp
.
如何在 ROOT 中包含多个文件?
使用 ROOT 最可靠的方法(至少在历史上和现在)是忽略解释器,而不是进行最简单的探索,并针对 ROOT 库显式编译 C++ 程序。例如,使用
g++ MySource.cc `root-config --libs --cflags` -o foo
从单个源文件编译可执行“foo”。有关该帮助脚本的更多信息,请运行“root-config --help”。
多文件程序/库没有什么特别的,只要您提供所需的 args 以指向 ROOT 库和头文件(并且这些库在运行时在 LD_LIBRARY_PATH 中可用)。如果需要,标准 C++ 指南将解释该步骤。您也可以安全地将其放入生成文件中。
在我看来,这比在 CINT 解释器中使用 .L 等命令更容易也更可靠。上次我尝试时,ACLiC 实际上是针对指定源文件的临时(和损坏的)版本进行编译,因此来自编译器的任何错误消息几乎都是无用的!
我使用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 项目的地方。库文件。示例 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)
最后,要使用 CMake 编译基于 ROOT 的代码,在源代码之外,您在顶级项目目录中创建一个“构建”目录,以便您的目录结构如下所示:
proj/
bin/
build/
src/
然后
cd build
cmake ..
您的二进制文件将位于 build/bin/ 目录中
希望这可以帮助。
看来我只想.L <filename>
为每个我想要的文件,因为.L
告诉 ROOT “将文件的内容加载到内存中”。虽然现在我不太确定加载文件的顺序,因为它们给了我错误。