首页 文章

在Xcode中设置Cern的ROOT,正确链接librariers

提问于
浏览
2

我想在我的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中设置所有内容 . 我在 Headers 搜索路径中包含了“/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'在这里声明内联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 回答

  • 1

    你可能已经想到了这一点,但万一其他人偶然发现这个问题,我在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 Headers 未被xcode识别,您将收到错误 'XXX.h' file not found . 这显然是因为我们需要告诉xcode在哪里找到 Headers .

    • 单击左侧菜单中的项目

    • 在"Build Settings"下单击"+" - > "Add User-Defined Settings" .

    enter image description here

    • 这将在"User-Defined"部分下添加一个参数 . 调用新参数"ROOTSYS"并将其指向ROOT安装的顶级目录 . 对我来说这是 /Users/user/root_cern/root_v6.06.04/ . (注意:此步骤绝对不是必需的,但可以减少其余的痛苦,并允许您更新ROOT安装,而无需更改下面的 Headers 和库路径)

    • 现在(仍在“构建设置”中)转到“搜索路径” - >“用户 Headers 搜索路径” . 在此字段中添加路径“$(ROOTSYS)/ include”

    • 将"Search Paths" - > "Always Search User Paths"字段设置为 Yes

    在这一点上,我们的 Headers 上的令人讨厌的错误消失了!不幸的是,该计划不会 Build . 查看构建错误表明存在很多链接错误!显然,我们需要更新链接器标志以包含我们想要编译的所有ROOT库 .

    • 打开终端并运行 $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

    • 复制上述 root-config 的输出并将其粘贴在"Build Settings" - > "Linking" - > "Other Linker Flags"下 . 请注意,您可以使用 $(ROOTSYS) 替换ROOT安装目录的所有路径实例,并且在更新ROOT版本时,将来不必更新它们 .

    现在该程序应该 Build 得很好!如果您仍然收到链接错误,请确保 TARGET 您're trying to build inherits it' s链接来自项目的信息 . 通过转到"Other Linker Flags"为您正在构建的目标并将其设置为 $(inherited) 来执行此操作 . 您将获得cos(x)函数的方便图 .

    plot of cos(x)

    几点说明:

    • 如果您不使用TApplication,程序将在您有机会查看您的情节之前结束 .

    • 您可以通过xcode GUI或在绘图的菜单栏中选择"File" - > "Quit Root"来结束程序 .

    • 如果您可以通过向目标添加额外的"Run Script"构建阶段来实现这一点,事情会变得复杂一些 . 现在,这应该让你开始 .

相关问题