【问题标题】:How to compile multiple files in ROOT如何在ROOT中编译多个文件
【发布时间】:2011-12-12 23:43:19
【问题描述】:

我编写了一个 C++ 程序(带有 main.cpp,以及各种头文件和实现文件),它可以在 g++ 下正常编译。现在我正在尝试在 Cern 的 ROOT 库中编译它,但我不知道如何编译,因为我知道如何在 ROOT 中编译文件的唯一方法是使用 .L main.cpp

如何在 ROOT 中包含多个文件?

【问题讨论】:

  • 是的,不清楚您所说的“ROOT”是什么意思。根目录? ROOT 库 (root.cern.ch)?还有什么? “根”标签似乎指代了各种事物。
  • @bames53 是的,我的意思是cern ROOT 库。谢谢!
  • 你在什么平台上使用什么编译器?
  • 快速搜索“cern root library”会得到:root.cern.ch/drupal/content/users-guide
  • @j_kubik 我正在使用 ROOT,它似乎是 C++ 的解释器?我在 OS X 和 Ubuntu 上都安装了它

标签: c++ compilation root-framework


【解决方案1】:

看来我只需要.L <filename> 处理我想要的每个文件,因为.L 告诉ROOT“将文件的内容加载到内存中”。虽然现在我不太确定加载文件的顺序,因为它们给了我错误。

【讨论】:

    【解决方案2】:

    使用 ROOT 最可靠的方法(至少在过去和现在)是忽略解释器,而不是为了最简单的探索,并针对 ROOT 库显式编译 C++ 程序。例如,使用

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

    从单个源文件编译可执行的“foo”。有关该帮助程序脚本的更多信息,请运行“root-config --help”。

    多文件程序/库没有什么特别的,只要您提供所需的 args 以指向 ROOT 库和头文件(并且这些库在运行时在 LD_LIBRARY_PATH 中可用)。如果需要,标准 C++ 指南将解释该步骤。您也可以安全地将其放入 makefile 中。

    在我看来,这比在 CINT 解释器中使用 .L 等命令更容易也更可靠。上次我尝试时,ACLiC 实际上是针对指定源文件的临时(和损坏)版本进行编译,因此来自编译器的任何错误消息几乎都是无用的!

    【讨论】:

    • 顺便问一下,反引号应该在-o foo之前吗?否则似乎无法找到 ROOT 头文件,但现在我收到错误消息/usr/bin/ld: cannot find -lPhysics。有什么想法可能导致这种情况吗?非常感谢!
    • 糟糕,是的,反引号应该在 -o 之前:最后一个标志和 arg 是编译器的选项。现已修复!
    • 回复。无法找到-lPhysics ...我遇到了一些麻烦,即使命令行看起来不错。尝试查看 libPhysics.so 的 ROOT 库安装区域中的文件系统(啊,这样的通用名称!参见 libCore、libGraphics... 叹息),如果它位于不寻常的位置,请使用 -L/path/to 强制执行/目录。我不确定,但是从 root-config 对 args 的排序可能有点功能失调:尝试“root-config --libs --cflags”来查看命令。希望对您有所帮助。
    • 啊哈,谢谢!我终于通过复制root-config 输出并删除-lPhysics 来编译foo 文件。但实际上运行 ./foo 会崩溃,即使它在带有 .L 的 ROOT 本身中工作得很好。与向量有关,可能与 ROOT 无关。诡异的。我本可以发誓同一段代码在另一个项目上运行良好。但是哦,好吧,我想我要放弃让 ROOT “正常工作”了。感谢安迪的所有帮助!
    【解决方案3】:

    我使用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/ 目录中

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-05-20
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 2010-10-04
      相关资源
      最近更新 更多