Xcode 4中的静态库

时间:2011-05-20 15:59:27

标签: ios xcode4 static-libraries xcode3to4

(之前我的问题已在此处提出,但我没有找到合适的答案。例如Xcode4 Workspace with Static library project & application project

我正在尝试使用第三方提供的库。它们提供了构建 libLibraryName.a 文件的XCode项目。他们建议将项目作为子项目添加到我自己的项目中,然后将产品 libLibraryName.a 文件添加到我的项目设置“Link Binary with Libraries”中描述的库集。

库正确构建:生成.a文件。但该项目在Products组下显示了一个红色的 libLibraryName.a 文件。我不能让它变成黑色。父项目表示无法找到 LibraryName 进行链接。

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

我知道XCode 4默认将中间文件和产品文件放在共享位置。我尝试过这个设置,并且我已经更改了设置,将产品文件放在构建设置中描述的文件夹中。两种设置都不起作用。

人们还建议为设备而不是模拟器构建。我试过这个无济于事。

是什么给出的?如何获取静态库项目以识别其构建产品的位置,并随后在另一个项目中引用此产品?

6 个答案:

答案 0 :(得分:55)

很多箍跳,但现在是我的笔记,我开始工作了。

  • 如果你创建一个新的股票XCode4 iOS“Cocoa Touch Static Library”项目(并为其添加一些代码),该项目将开箱即用。但是,当您进行设备构建时,产品文件 libLibraryName.a 仅变为黑色(表示文件不存在)。模拟器构建并未显示目标是在实际构建时构建的。

  • 在项目目标构建设置中,“按配置构建产品路径”默认为$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)如果将其更改为其他内容(或者如果您从使用的XCode3.x升级项目我相信$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)$(IPHONEOS_DEPLOYMENT_TARGET)为默认值,然后产品文件 libLibraryName.a 永远不会变黑。对我来说,这说明XCode中存在一个错误。

  • 我可以在没有产品文件构建后变黑(这是一个很好的指标,但是嘿,无论如何。)但我确实需要我的消费项目才能找到正确的库构建,无论是模拟器还是设备。在一个理想的世界中,会有一个带有i386 / arm6 / arm7位的.a文件,但同样,这不是我的库/库项目。

  • XCode4 Transition Guide向我展示了光明。它规定创建一个托管两个项目的工作区,它们都将构建到同一个共享构建目录中。我之前没有使用工作区,所以我使用文件/另存为工作区命令来创建新的工作区文件。然后,我添加了库项目,注意确保它作为同行放置到我的主项目而不是孩子。

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

  • 我还必须确保在“管理方案”对话框中检查每个项目的“共享”复选框。

  • 最后,为了指定我的主项目的库依赖项,我只需转到目标Build Phases选项卡,Link Binaries with Libraries部分,然后单击'+',然后选择 libLibraryName.a 文件位于Workspace文件夹下方。请注意,之前没有工作空间且没有公共构建目录时我尝试过此操作,结果是XCode在链接期间找不到.a文件。

所有的说和做,它就像一个魅力。我不禁想到它应该更容易 - 因为我相信它是在XCode3中。

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

答案 1 :(得分:6)

在这里查看我的答案,看看它是否对您有所帮助:

Linking a static library to an iOS project in XCode 4

这些是基于我对自己图书馆的说明。我认为原始过程中缺少的一步是您不会将静态库作为目标依赖项添加到您的应用程序项目中(在我的说明中的第3步),同时将其链接到“Link Binary with Libraries”。您还可能需要执行步骤#5,具体取决于标头由静态库项目链接的方式。

当我使用自己的应用程序执行此过程时,这些应用程序具有对静态库项目的跨项目引用,它实际上比Xcode 3中的等效过程少一步。

答案 2 :(得分:3)

查看我的solution noteOpen Radar entry

红色产品节点是Xcode的错误。您可以通过更改项目构建设置上的SDKROOT来使其有效。 目标构建设置不适用于IDE显示和&支持。

修改

供以后参考。

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

我认为Xcode仍有内部错误与此相关。现在是时候让Xcode稳定下来了。

答案 3 :(得分:2)

我和我的团队有同样的问题。其中一个开发人员遇到了这个问题,但我的xcode能够编译并正确找到标题。顺便说一句:所有“构建设置”都已正确配置(始终搜索用户路径,用户标题路径等)。

我意识到他的项目位于路径中有空格的目录中(../my project / blah.xcodeproj)。改变这一点,Xcode能够在同一个工作区内找到静态库中的头文件。

请注意目录名称。 我的两分钱

答案 4 :(得分:1)

一个澄清细节(在挖掘构建输出之后,直到我开始睁大眼睛):如果您发现您的库标题正在导出到Build/Products/Debug并且您的父项目正在查找Build/Products/Debug-iphonesimulator ,您的库是为OS X而不是iOS构建的。您可以在项目设置的“体系结构”部分的“支持的平台”设置中进行更改。如果您创建一个vanilla C ++静态库项目,OS X似乎是默认设置,因此这种情况很容易遇到。

答案 5 :(得分:-1)

我的一个图书馆遇到了这个问题。我实际上有4个我构建的其他库,包括看起来很好,看起来很黑,但没有。通过更改库项目的Build Settings中的Base SDK来解决我的红色库。由于该库可以为Mac OS X和iOS构建,因此它被设置为Mac OS X设置。 iOS目标库仍然构建但从未变为黑色。一旦我将Base SDK构建设置更改为最新iOS,我的库就变为黑色。