Xcode 4中的静态库

41

我的问题之前在这里被问过,但是没有有效的答案。例如Xcode4 Workspace with Static library project & application project

我正在尝试使用第三方提供的库。他们提供了XCode项目,用来构建一个libLibraryName.a文件。他们建议将该项目作为子项目添加到我的项目中,然后将产品libLibraryName.a文件添加到我的项目设置“链接二进制文件和库”中描述的库集合中。

该库确实正确构建:.a文件已生成。但是该项目在产品组下显示红色的libLibraryName.a文件。我无法让它变成黑色。父项目说找不到链接LibraryName

作为测试,我使用XCode 4静态库模板创建了一个新的静态库项目。该项目表现出相同的行为-即使构建了.a文件,产品也永远不会变为“黑色”(编辑:如果您为设备而非模拟器构建,则会变为黑色)。

我知道XCode 4默认情况下将中间和产品文件放置在共享位置。我尝试了这个设置,并将设���更改为将产品文件放置在构建设置中描述的文件夹中。两种设置都无效。

人们还建议为设备而不是模拟器构建。我尝试了这个,但没有成功。

出了什么问题?我该如何让静态库项目识别它构建产品的位置,并在另一个项目中引用此产品?


5
天哪,我讨厌SO上的编辑功能。当某人的英语水平不够好,写出一些毫无意义的东西,但有人花时间解析它时,这个功能很棒。但是,你会遇到想要“改进”你问题的人,而实际上他们并没有改进。@zoul- 修改我的帖子标题并没有改进它,因为我的问题实际上比“在Xcode4中构建静态库”更通用。如果你读了问题,你就会发现这是其中的一部分,但主要问题是让XCode找到并使用我已经成功构建的库。 - TomSwift
1
如果您觉得需要的话,您总是可以选择回滚更改。我又一次修改了标题,希望这个版本对您来说没问题。 - zoul
3
@zoul - 谢谢。对于我发泄的话语感到抱歉。 - TomSwift
6个回答

55

这里经历了很多波折,但现在我已经让它工作了。以下是我的笔记。

  • 如果您创建一个新的XCode4 iOS“Cocoa Touch Static Library”项目(并向其中添加一些代码),则该项目将能够正常构建。但是,只有在执行设备构建时,产品文件 libLibraryName.a 才会变为黑色(从红色变为黑色,表示文件不存在)。模拟器构建不会显示目标已构建完成,实际上却已构建完成。

  • 在项目目标构建设置中,“Per-Configuration Build Products Path”的默认值为 $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)。如果您将其更改为其他内容(或者如果您将项目从使用 $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)$(IPHONEOS_DEPLOYMENT_TARGET)作为默认值的XCode3.x升级,则产品文件 libLibraryName.a 永远不会变为黑色。对我来说,这意味着XCode中存在错误。

  • 我可以不需要产品文件在构建后变成黑色(它是一个很好的指示器,但无所谓)。但是,我确实需要我的消费项目能够找到正确的库构建,无论是模拟器还是设备。在理想情况下,将有一个单独的.a文件其中包含i386/arm6/arm7位,但是再次强调,这不是我的库/库项目。

  • XCode4转换指南 是启示我的。它建议创建一个工作区,将两个项目都放在其中,并且它们将构建到同一个共享构建目录中。我之前没有使用工作区,所以我使用了 文件/另存为工作区 命令来创建新的工作区文件。然后,我添加了库项目,确保它被放置为主项目的同级而非子级。

  • 我还必须确保工作区配置为将构建输出放入公共文件夹。在 Workspace 设置对话框中,将 Build Location 设置为“将构建产品放置在衍生数据位置”。

  • 我还必须在 Manage Schemes 对话框中为每个项目勾选“shared”复选框。

  • 最后,为了指定主项目的库依赖项,我只需转到目标 Build Phases 选项卡,Link Binaries with Libraries 部分,然后点击“+”,从 Workspace 文件夹下选择 libLibraryName.a 文件。请注意,在没有工作区和公共构建目录时尝试此操作时,结果是 XCode 在链接过程中找不到 .a 文件。

  • 总的来说,它的工作效果很好。我不禁想,它应该更容易一些——正如我相信在 XCode3 中那样。

    我很乐意阅读其他人对这一切的经验,或任何关于使静态库链接良好的其他(更简单?)方法的反馈意见。


在上述所有设置完成后,仍然没有可用的目标依赖项可添加。我可以“构建以运行”,但无法“构建以存档”(出现“找不到库”错误)。我的解决方案相当丑陋,是在构建目录中找到有问题的库,并将其拖入我的应用程序项目中(不复制)。现在,Xcode已经知道它的位置,一切都可以正常构建。这可能会为其他人节省一些头发。感谢@TomSwift的其余部分。 - ApeOnFire
1
注意:在“管理方案”对话框中的“共享”复选框与正确使用静态库无关。 “共享”复选框仅确定方案是否对其他用户可见。 - sean woodward
2
这对我来说非常有效,但是如果我更改库中的任何内容,则构建使用它的项目不会导致库被重新构建。我必须手动构建库,或清除/构建使用它的项目。有没有什么技巧可以让Xcode根据需要构建库? - spstanley
我正在执行以下步骤将“Facebook-iOS-SDK.xcodeproj”包含到我的项目中,但即使添加了头文件搜索路径,它仍然显示“Facebook.h”:没有这样的文件或目录。 Facebook和Apple让我发疯!!! - Zennichimaro

6

请查看我的回答,看看是否有帮助:

在XCode 4中将静态库链接到iOS项目

这些基于我自己库的指令。我认为你原始过程中缺少的步骤是,你没有同时将静态库添加到你的应用程序项目作为目标依赖项(我的指令中的第3步),而你在“链接二进制文件”中链接它。根据静态库项目如何链接头文件,你可能还需要执行第5步。

当我使用我自己的应用程序进行此过程时,它实际上比Xcode 3中的等效过程少了一步。


3

请查看我的解决方案注释Open Radar条目

红色的产品节点是Xcode的一个错误。您可以通过更改项目构建设置中的SDKROOT来使其正常工作。目标构建设置无法用于IDE显示和支持。

编辑

供以后参考。

目前,我认为Xcode 项目不能完全处理多个平台。虽然它可以显示多个平台,但只能通过SDKROOT设置选择一个平台进行屏幕显示。如果您选择iOS,它将使用类似Debug-iphoneos的构建产品路径。因此,所有Mac OS X目标都将丢失。如果您选择Mac OS X,它将使用类似Debug的内容。因此,所有iOS目标的产品都将丢失。

我认为Xcode仍存在与此相关的内部错误。需要花费很长时间使Xcode稳定下来。

2
我和我的团队遇到了同样的问题。其中一位开发人员遭受了这个问题,然而我的xcode能够编译并正确找到头文件。顺便说一句:所有的“构建设置”都已经正确配置(始终搜索用户路径、用户头文件路径等)。
我意识到他的项目在一个路径中有空格(../my project/blah.xcodeproj)。改变这个,Xcode就能够从同一工作区内的静态库中找到头文件。
只要注意目录名即可。
以上是我的看法。

1

一个澄清的细节(在挖掘构建输出后,直到我开始眼花缭乱):如果你发现库头文件被导出到 Build/Products/Debug,而你的父项目正在寻找 Build/Products/Debug-iphonesimulator,那么你的库是为 OS X 构建的,而不是 iOS。你可以在项目设置的“架构”部分的“支持的平台”设置中更改此设置。如果您创建了一个普通的 C++ 静态库项目,则 OS X 似乎是默认设置,因此很容易遇到这种情况。


-1

我在使用我的一个库时遇到了问题。实际上,我还有其他4个库,它们都被包含在内,看起来很好,是黑色的,但其中一个不是。通过更改库项目的构建设置中的基本 SDK,解决了我的红色库的问题。由于该库可以为Mac OS X和iOS构建,因此它被设置为Mac OS X设置。iOS目标库仍然可以构建,但从未变成黑色。一旦我将基本SDK构建设置更改为最新的iOS,我的库就变成了黑色。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接