公共头文件路径、安装目录、搜索头文件路径和其他噩梦
Posted
技术标签:
【中文标题】公共头文件路径、安装目录、搜索头文件路径和其他噩梦【英文标题】:Public Header Path, Installation Directory, Search Header Path and other nightmares 【发布时间】:2013-04-19 03:11:22 【问题描述】:我有一个由 2 个库(库 A 和库 B)和一个包组成的项目。每一个都像项目一样创建,并通过拖动它们导入到主项目中。
仅仅拖动它们不足以让 Xcode 找到所有头文件来编译整个项目,所以我不得不使用硬路径来破解路径,但这很糟糕,因为路径可以改变,我将无法再次编译这个项目.我想使用像these ones 这样的宏来访问这些文件,但是在测试了几乎所有这些之后,我无法让它工作。
我必须使编译工作的解决方案如下。
我已经调整了每个库,将它们的公共标头保存在里面
/Users/rubberduck/Library/Developer/Xcode/DerivedData/MyProject-dnaimaovsccuvieahmvgttwjnabc/Build/Products/Debug-iphoneos/
使用目标名称,因此在编译后它们会将其公共标头放在上面
/Users/rubberduck/Library/Developer/Xcode/DerivedData/MyProject-dnaimaovsccuvieahmvgttwjnabc/Build/Products/Debug-iphoneos/libraryA
和
/Users/rubberduck/Library/Developer/Xcode/DerivedData/MyProject-dnaimaovsccuvieahmvgttwjnabc/Build/Products/Debug-iphoneos/libraryB
现在的问题是 libraryB 需要 libraryA 的头文件来编译。如果这些是兄弟目录,我应该在 libraryB 的标题搜索路径中放置什么以指向 libraryA。
注意:我需要一个不是硬编码的路径,而是使用我提到的那些宏之一。
【问题讨论】:
【参考方案1】:Apple 似乎已经脱离了公共头路径作为静态库的首选机制,这可能是由于这些类型的复杂性。如果您创建一个新的静态库项目,它将有一个“复制文件”构建阶段,其中头文件被复制到 "Products Directory"
中,子路径为 "include/$PRODUCT_NAME"
。
当您导入标头时,您将使用#import <MyProduct/header1.h>
,而不是使用#import "header1.h"
。我相信在编译之前需要构建这些库,但如果它们包含在您的“将二进制文件与库链接”阶段中,这应该不是问题。
【讨论】:
【参考方案2】:你可以试试,
添加 Xcode 可用于动态查找 Lib 的“Source Tree”变量。 在 Xcode 首选项 > “位置”按钮 > “源树”选项卡 > 创建一个新的源树变量。 对于 Lib,创建 LIB_SRC 并让它指向 /path_to_lib/lib/src/ 注意:Xcode 不允许路径包含任何空格!
【讨论】:
创建此源树变量后,我该如何处理它?我在哪里使用它? 在搜索路径中使用这个变量 好的,这就是我所做的:我添加了这个变量并更改了所有实验室的所有 PUBLIC HEADER 字段以指向它。然后将所有 HEADER SEARCH PATHS 和所有 LIBRARY SEARCH PATHS 更改为指向此。最终结果:现在我没有 7 个编译器错误,而是 50 个。如果这不是应该如何使用的,请详细说明你的答案。对不起,你在这里很电报。 抱歉,您需要在库搜索路径中使用该变量,以便 Xcode 使用该变量找到该路径,您需要添加设置其他链接器标志 -ObjC、-all_load。对你有帮助吗? 注意:Xcode 不允许路径包含任何空格!【参考方案3】:这显然是一个 Xcode 错误或限制。
对此我唯一的解决方案是在同一个工作区中多次导入项目使用的子项目。
例如:假设我有一个 libraryA 被主项目和 libraryB 使用。为了使 Xcode 编译,我所做的只是在同一个工作空间中导入 libraryA 两次,一次用于 libraryB,一次用于主项目,并且一切编译正常。
Xcode 4 从界面到引擎都被 Apple 设计得很糟糕,现在我明白为什么这么多人讨厌它了(62% 在网站民意调查中)。
【讨论】:
以上是关于公共头文件路径、安装目录、搜索头文件路径和其他噩梦的主要内容,如果未能解决你的问题,请参考以下文章