我想在我的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 回答
你可能已经想到了这一点,但万一其他人偶然发现这个问题,我在xcode中设置我的ROOT(v6.06.04) . 为了演示,让我们从头开始使用新的xcode项目 .
假设我们想在xcode中运行以下程序(请注意它使用ROOT类)
如果您只是将此程序复制并粘贴到xcode中,您将看到ROOT Headers 未被xcode识别,您将收到错误
'XXX.h' file not found
. 这显然是因为我们需要告诉xcode在哪里找到 Headers .单击左侧菜单中的项目
在"Build Settings"下单击"+" - > "Add User-Defined Settings" .
这将在"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)函数的方便图 .几点说明:
如果您不使用TApplication,程序将在您有机会查看您的情节之前结束 .
您可以通过xcode GUI或在绘图的菜单栏中选择"File" - > "Quit Root"来结束程序 .
如果您可以通过向目标添加额外的"Run Script"构建阶段来实现这一点,事情会变得复杂一些 . 现在,这应该让你开始 .