最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

[已解决]Xcode中Project和Target之间的关系

Xcode crifan 4859浏览 0评论

更主要想要知道:

在Targets中的第二列和第三列是什么含义。。。

以及:

Targets和Project中的设置,有何关系?

Build Settings中的Levels中的,某个配置属性的值

分4列:

  • Resolved
  • ProjectName App?
  • ProjectName Project?
  • iOS Default

主要是要搞清楚,这4列,尤其是

第二列和第三列的区别

因为之前第三列设置了值

但是无意间忽略了第二列

结果就是没生效

就是下面4列:

Xcode Target vs Project

Xcode Target

Build Settings

A target defines a single product

Xcode: project settings vs. target settings – Stack Overflow

WorkSpace Vs Project Vs Target in Xcode – Stack Overflow

iOS:[译]Xcode Concepts–概念Target、Project、Build Setting、Workspace、Scheme – houseq 的专栏 – 博客频道 – CSDN.NET

“a build Setting是一个变量,包含着怎么build product的处理信息。例如,Xcode传给编译器的选项。  

         build settings有project level和target level俩中级别。project-level中的build setting适用项目中所有的targets,只要该build setting没有被相应的target重写。

         每一个target管理着build one product的source files。一个build 设置包含一系列build 特定product 的build settings。例如,通常有debug  和release俩中分开的build 设置。

         一个build setting在Xcode中的包含俩部分:setting title 和 definition。前者标示着该build setting并且可被用在其他的settings。后者是一个常量或者一个表达式,确定了build setting的值。一个build setting可能也有一个显示名称,在Xcode界面中显示build setting。

         另外,当你选择某个project template创建一个新的project,default build setting也相应的由Xcode生成了,你也可以为project或者某个target创建自定义build settings。一个conditional build setting的值取决于它的先决条件有没有被满足。这种机制允许你,例如,根据targeted architecture确定build a product的sdk。 ”

搜:

xcode build setting levels resolved project iOS Default

xcode build setting levels

Xcode Build Settings Reference

抽空再去搞清楚:

Build Settings中的不同的levels的含义

Editing a Build Setting

目前理解了一点了:

Project是针对于整个项目的

Target是针对于单个目标的,一般的项目都默认有三个目标:

ProjectName

ProjectNameTests

ProjectNameUITests

然后Project的level是高于Target的level的

-》高优先级的设置,默认是用于低优先级的设置的

-》但是如果设置了低优先级(Target中)的值,会覆盖掉高优先级(Project中)的值

然后好像明白此处的现象了:

以下用ProjectName表示你的app,你的项目的名字

下面图中,是Resolved和Target空的值:

应该是由于:

第一列:带app的图标的,名字叫做:Resolved,估计含义是:最终的值,表示各种不同level合并后的值

第二列:带app的图标的,名字叫做:ProjectName,图标和Resolved一样,表示当前的Target-》此处是TARGETS中的第一个target-》所以图片也是一样的

如果换成:

ProjectNameTests或ProjectNameUITests,则都是没有图标的了:

第三列:带Xcode项目图标(ProjectName.xcodeproj的文件的那种图标),名字叫做:ProjectName,表示是Project项目这种level的设置-》其值就是你在PROJECT中设置的值:

$(SRCROOT)/JianDao-Bridging-Header.h

第四列:方框中带个小iPhone的图标,名字是:iOS Default,表示的是对应的iOS版本的默认的值?

而此处的各种level的值是如何获得,如何产生的,应该是:

第四列的iOS Default,这个不用我们关心,会自动设置为默认值

第三列的带Xcode项目图标的ProjectName,则是根据我们在PROJECT中设置的值来的

-》点击编辑此值的话:

会同样修改掉PROJECT那里的值:

-》所以此处只是为了方便在编辑更低优先级(Target)中的值时,提供让你修改对应的,更高优先级的(Project中)的选项的机会

第二列的带app图标的ProjectName的值,则是我们此处,可以自己手动设置的值了

对应的,此处的设置的值,会覆盖override了高优先级的Project中的值

第一列是app的图标的Resolved,表示解决了冲突?合并后的值,最终的生效的值

-》由于遵循优先级低的覆盖优先级高的,所以依次是:

第二列(Target的)覆盖第三列(Project的),第三列(Project的)覆盖第四列(iOS Default)

-》所以就会出现:

我此处,之前不知道什么时候,把此处的

Object-C Bridging Header

的第二列(Target的)清空了

-》导致了最终的有效的值是空的,而不是第三列(Project中)设置的

$(SRCROOT)/JianDao-Bridging-Header.h

-》导致代码找不到导入的对应的库而程序出错了。

[总结]

如果对于上述逻辑觉得麻烦,那么就直接选中那个Combined:

这样看到的值,就始终都是最终的,生效的值

-》此处的Combined看到的值,等价于Levels中Resolved的值

-》都是指的是最终有效的值

-》这样就会避免设置值的时候,搞混淆,没有生效了。

-》比如此处,去设置对应的头文件的路径:

即可。

转载请注明:在路上 » [已解决]Xcode中Project和Target之间的关系

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 这个优先级的问题不应该是target最高,project次之,default最低,高优先级优先生效?这样的逻辑才能说通啊
    mukekeheart7年前 (2018-01-19)回复
92 queries in 0.363 seconds, using 22.12MB memory