41

(我的问题之前在这里被问过,但我看不到任何有效的答案。例如带有静态库项目和应用程序项目的 Xcode4 工作区

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

该库确实构建正确:生成 .a 文件。但是该项目在 Products 组下显示了一个红色的libLibraryName.a文件。我不能让它变黑。并且父项目说它找不到用于链接的LibraryName 。

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

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

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

是什么赋予了?如何让静态库项目识别它构建产品的位置,然后在另一个项目中引用该产品?

4

6 回答 6

55

很多箍跳,但这是我的笔记,现在我让它工作了。

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

  • 在项目目标构建设置中,“Per-Configuration Build Products Path”默认为$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 如果您将其更改为其他内容(或者如果您从 XCode3.x 升级项目$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)$(IPHONEOS_DEPLOYMENT_TARGET),我相信它用作默认值),那么 Product文件libLibraryName.a永远不会变黑。对我来说,这说明 XCode 中某处存在错误。

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

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

  • 我必须确保将工作区配置为将构建输出放置到公共文件夹中。在 Workspace Settings 对话框中,将 Build Location 设置为“Place Build Products in Derived Data Location”

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

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

总而言之,它就像一个魅力。我不禁认为它应该更容易 - 因为我相信它是在 XCode3 中。

我很乐意阅读其他人在这方面的经验,或者关于其他(更简单?)方法的任何反馈,以使链接静态库正常工作。

于 2011-05-20T19:59:20.370 回答
6

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

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

这些是基于我对我自己的图书馆的说明。我认为您的原始过程中缺少的步骤是您不要将静态库作为目标依赖项添加到您的应用项目中(我的说明中的第 3 步),同时在“将二进制文件与库链接”中链接它。您可能还需要执行第 5 步,具体取决于静态库项目如何链接标题。

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

于 2011-05-25T19:42:18.760 回答
3

看看我的解决方案说明打开雷达条目

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

编辑

供以后参考。

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

我认为 Xcode 仍然存在与此相关的内部错误。让Xcode稳定下来还有很长的路要走。

于 2011-06-19T06:07:52.230 回答
2

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

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

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

于 2011-11-14T15:09:40.190 回答
1

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

于 2013-03-11T20:47:19.650 回答
-1

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

于 2013-03-07T00:08:20.377 回答