在Xcode中设置Cern的ROOT,正确链接图书馆

时间:2016-05-01 07:55:43

标签: c++ xcode root-framework

我想在我的Xcode IDE中设置CERN的ROOT,但是我在链接库时遇到了问题。我正在使用root 6.04.14和xcode 7.3。 我创建了一个模拟项目,我只需要一个.cpp,其中包含一个来自root的基本类(#include“TFile.h”)。我可以通过命令行编译:

clang ++ -std = c ++ 11 -I / opt / root / root-6.04.14 / include / root -L / opt / root / root-6.04.14 / lib / root -lCore main.cpp

现在要在Xcode IDE中设置所有内容。我在标题搜索路径中包含了“/opt/root/root-6.04.14/include/root”,Xcode没有抱怨,所以我猜它找到了头文件。我尝试将“/opt/root/root-6.04.14/lib/root -lCore”添加到库搜索路径但是我收到错误: 在/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:301中包含的文件中: /opt/root/root-6.04.14/include/root/Math/math.h:65:11:错误:全局命名空间中没有名为'log1p'的成员;你的意思是'log1p'吗?    return :: log1p(x);           ^〜 /opt/root/root-6.04.14/include/root/Math/math.h:63:15:注意:'log1p'在这里声明 内联双log1p(双x){               ^ /opt/root/root-6.04.14/include/root/Math/math.h:76:11:错误:全局命名空间中没有名为'expm1'的成员;你的意思是'expm1'吗?    return :: expm1(x);           ^〜 /opt/root/root-6.04.14/include/root/Math/math.h:74:15:注意:'expm1'在这里声明 inline double expm1(double x){

依旧...... 此外,当我查看终端命令Xcode正在运行时(至少这是我认为的那样),没有包含“-L / opt / root / root-6.04.14 / lib / root -lCore”。然后我尝试将“-L / opt / root / root-6.04.14 / lib / root -lCore”放入其他链接器标志中。现在它包含在终端命令中,但仍然给我同样的错误。

问题1: 我注意到Xcode正在运行“/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang”,而我一直在使用clang ++,区别在哪里,如何更改? 问题2: 将目录添加到库搜索路径并通过链接器标志将其放入之间有什么区别? 问题3: 最大的一个,我在哪里搞砸了?

1 个答案:

答案 0 :(得分:2)

你可能已经想到了这一点,但是万一其他人偶然发现这个问题,我在xcode中设置我的ROOT(v6.06.04)。为了演示,让我们从头开始使用新的xcode项目。

假设我们想在xcode中运行以下程序(请注意它使用ROOT类)

#include <iostream>
#include "TApplication.h"
#include "TCanvas.h"
#include "TGraph.h"
#include <vector>

int main(int argc, const char * argv[]) {
    // Create a TApplication so that we can get plot the histogram
    TApplication* myApp = new TApplication("myApp", 0, 0) ;

    // Create some vector information
    std::vector<double> x(100), y(100) ;

    for (int i=0; i<x.size(); i++) {
        x[i] = i * (10.0/x.size()) ;
        y[i] = std::cos(x[i]) ;
    }

    // Create a TGraph
    TGraph* graph = new TGraph(x.size(), &x[0], &y[0]) ;

    // Create a canvas and draw the graph
    TCanvas* canvas = new TCanvas("canvas","canvas") ;
    graph->Draw("ap0") ;
    canvas->Update() ;

    // Run the TApplication to produce all of the plots
    myApp->Run() ;
    return 0;
}

如果您只是将此程序复制并粘贴到xcode中,您会看到ROOT标题未被xcode识别,您会收到错误'XXX.h' file not found。这显然是因为我们需要告诉xcode在哪里找到标题。

  1. 点击左侧菜单中的项目
  2. 在“构建设置”下,点击“+” - &gt; “添加用户定义的设置”。
  3. enter image description here

    1. 这将在“用户定义”部分下添加参数。调用新参数“ROOTSYS”并将其指向ROOT安装的顶级目录。对我而言,这是/Users/user/root_cern/root_v6.06.04/。 (注意:此步骤不是绝对必要的,但其余部分不那么痛苦,并允许您更新ROOT安装,而无需更改下面的标题和库路径)

    2. 现在(仍然在“构建设置”中)转到“搜索路径” - &gt; “用户标题搜索路径”。在此字段中添加路径“$(ROOTSYS)/ include”

    3. 设置“搜索路径” - &gt; “始终搜索用户路径”字段为
    4. 此时我们标题上的令人讨厌的错误消失了!不幸的是,该计划不会建立。查看构建错误表明存在很多链接错误!显然,我们需要更新链接器标志以包含我们想要编译的所有ROOT库。

      1. 打开终端并运行$ROOTSYS/bin/root-config --libs。对我来说输出是:

        -L / Users / user / root_cern / root_v6.06.04 / lib -lCore -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -lMultiProc -lpthread - Wl,-rpath,/ Users / user / root_cern / root_v6.06.04 / lib -stdlib = libc ++ -lm -ldl

      2. 复制上述root-config的输出并将其粘贴在“构建设置”下 - &gt; “链接” - &gt; “其他链接标志”。请注意,您可以使用$(ROOTSYS)替换ROOT安装目录的所有路径实例,并且在更新ROOT版本时,将来不必更新它们。

      3. 现在程序应该构建得很好!如果您仍然遇到链接错误,请确保您尝试构建的 TARGET 继承了项目中的链接信息。通过转到正在构建的目标的“Other Linker Flags”并将其设置为$(inherited)来执行此操作。你将获得cos(x)函数的方便图。

        plot of cos(x)

        一些注意事项:

        • 如果您不使用TApplication,程序将在您有机会查看您的情节之前结束。
        • 您可以通过xcode GUI或选择“File” - &gt;结束程序。情节菜单栏中的“退出根”。
        • 如果您正在尝试编写一个您希望ROOT能够流式传输到该文件的类,那么事情会变得复杂一些。可以通过向目标添加额外的“运行脚本”构建阶段来实现。但就目前而言,这应该可以让你开始。