在Xcode中从Cern设置ROOT,正确链接库

eufgjt7s  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(143)

我想在我的Xcode IDE中设置来自CERN的ROOT,但是我在链接库时遇到了问题。我使用的是root 6.04.14和xcode 7.3。我创建了一个模拟项目,其中我只包含了一个.cpp,其中我包含了一个来自root的基本类(#include“TFile.h”)。我可以通过以下命令行编译这个项目:
如果您有任何问题,请与我们联系。如果您有问题,请与我们联系。
现在我们来设置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:.h:65:11:错误:全局命名空间中没有名为“log 1 p”的成员;您是指简单'log 1 p'吗?return::log 1 p(x);这是一个很好的例子,因为它是一个很好的例子。注意:这里声明的“log 1 p”内嵌了双精度log 1 p(双精度x){ ^ /opt/root/root-6.04.14/include/root/Math/math.h:76:11:错误:全局命名空间中没有名为“expm 1”的成员;您的意思是简单的“expm 1”吗?return::expm 1(x);这是一个很好的例子。注意:'expm 1'在此处声明为内联双精度expm 1(双精度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:大的那个,我哪里搞砸了?

bf1o4zei

bf1o4zei1#

你可能已经明白了这一点,但是为了防止其他人在这个问题上犯错误,这里是我如何在xcode中设置我的根(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中,你会看到xcode无法识别ROOT头文件,你会得到错误'XXX.h' file not found。这显然是因为我们需要告诉xcode在哪里找到头文件。
1.在左侧菜单中单击您的项目
1.在“构建设置”下,单击“+”-〉“添加用户定义的设置”。

1.这将在“User-Defined”部分下添加一个参数。调用新参数“ROOTSYS”并将其指向您的根安装目录的顶级目录。对我来说,这是/Users/user/root_cern/root_v6.06.04/。(注意:这一步不是绝对必要的,但可以减少其他步骤的痛苦,并允许您更新您的ROOT安装,而不必更改下面的头文件和库路径)
1.现在(仍在“构建设置”中)转到“搜索路径”-〉“用户头搜索路径”。在此字段中添加路径“$(ROOTSYS)/include”
1.将“搜索路径”-〉“始终搜索用户路径”字段设置为
在这一点上,我们的头文件上的讨厌的错误已经消失了!不幸的是,程序无法构建。查看构建错误显示有大量的链接错误!显然,我们需要更新我们的链接器标志,以包括所有我们想要编译的根库。
1.打开一个终端,运行$ROOTSYS/bin/root-config --libs,输出如下:
-L/用户/用户/根_中心/根_版本6.06.04/lib -l核心-l RIO-l网络-l历史记录-l图形-l图形3d-l图形垫-l树-l打印-l附言-l矩阵-l物理-l数学核心-l线程-l多处理器-l线程-Wl,-r路径,/用户/用户/根_中心/根_版本6.06.04/lib -标准库=libc++ -lm -ldl
1.复制上面root-config的输出并将其粘贴到“构建设置”-〉“链接”-〉“其他链接器标志”下。请注意,您可以用$(ROOTSYS)替换您的根目录安装路径的所有示例,并且在将来更新您的根版本时不必更新它们。
现在程序应该构建得很好了!如果你仍然得到链接错误,请确保你试图构建的TARGET继承了项目的链接信息。为此,请转到你正在构建的目标的“Other Linker Flags”,并将其设置为$(inherited)。你将得到一个cos(x)函数的方便图。

注意事项:

  • 如果不使用TApplication,程序将在您有机会查看出图之前结束。
  • 您可以通过xcode GUI或在绘图菜单栏中选择“File”-〉“Quit Root”来结束程序。
  • 如果你想写一个类,让ROOT能够流到文件中,事情会变得有点复杂。可以通过在目标中添加一个额外的“运行脚本”构建阶段来实现。现在,这应该可以让你开始了。
xqkwcwgp

xqkwcwgp2#

谢谢你的详细指导,我尽可能精确地遵循它。只有备注:$(inherited)我不确定。不幸的是它在我的MAC(M1)上不起作用,Xcode 14.0。用Home Brew安装了ROOT。ROOT命令行工具工作正常(我得到了图形)。Xcode没有在代码中给予错误(红色条)。但在“ROOT_basic”中有6个错误:

error build: Undefined symbol: TApplication::TApplication(char const*, int*, char**, void*, int)
error build: Undefined symbol: TVersionCheck::TVersionCheck(int)
error build: Undefined symbol: TGraph::TGraph(int, double const*, double const*)
error build: Undefined symbol: TCanvas::TCanvas(char const*, char const*, int)
error build: Undefined symbol: TObject::operator delete(void*)
error build: Undefined symbol: TStorage::ObjectAlloc(unsigned long)

编辑:原来是安装问题,我通过Brew卸载了Root,用Macports重新安装,现在可以工作了

相关问题