【问题标题】:Xcode: Conditional Build Settings based on architecture (Device (ARM) vs Simulator (i386))Xcode:基于架构的条件构建设置(设备(ARM)与模拟器(i386))
【发布时间】:2010-11-15 18:14:23
【问题描述】:

我正在构建一个必须在模拟器和设备上运行的 iPhone 应用程序。但是,我使用的是一个外部编译的库,它有一个版本用于模拟器,一个版本用于设备(​​不同的 CPU)。

我该怎么做?我来自 Visual C++,所以我是 Xcode 的新手,但我找不到方法。

编辑,2016 年 3 月:这个问题是在大约 6 年前的 2009 年 7 月提出的。从那以后 Xcode 发生了很大的变化,但我想有些东西仍然存在。例如,现在接受的答案在 Xcode v3 中不是一个选项。

【问题讨论】:

    标签: iphone xcode compiler-construction build linker


    【解决方案1】:

    我在集成 Adob​​e Omniture 的“AppMeasurement”库时遇到了这个问题,该库目前编译为 3 种架构:libAppMeasurement-iOSSimulator.a、libAppMeasurement-iOSDevice.a 和 libAppMeasurement-iOSDevice-armv7.a。

    虽然这里的其他答案基本正确,但我最终不得不去其他地方真正理解并解决问题。

    第 1 步。了解问题

    这个blog post 很好地解释了整个问题。它提供了解决问题的从头到尾的说明Xcode 3。请参阅下面的 Xcode 4。

    注意:您可以尝试跳过他所说的添加静态库然后删除它们的部分。下次我这样做时,我可能只是添加头文件,然后直接跳到编辑其他链接器标志。

    第 2 步。Xcode 4 中的条件构建设置

    StackOverflow page 解释了在 Xcode 4 中设置条件构建设置的新方法。提示:“构建设置”选项卡上的文本字段启用了拖放功能;一旦您准备好在其他链接器标志下编辑条件构建设置,您只需将静态库文件拖到文本字段上,Xcode 将自动输入(希望是相对的)路径。

    这是我的“其他链接器标志”的屏幕截图,一旦我收到“缺少所需的架构 i386”警告就会消失且没有构建错误:

    __

    【讨论】:

    • 将其拖入“其他链接器标志”对我有用。 (确保你先双击它,这样你就可以将它拖到弹出窗口中,如果你已经在行中设置了。)
    • 哇,太好了,没看到。知道它在 .xcconfig 文件中是如何表示的吗?我需要在 gcc 中包含 -lgcov,在 llvm 中包含 -lrt_profile!
    • 我找到了这篇文章:cocoabuilder.com/archive/xcode/… 内容如下: 1) 创建自定义构建设置 GCC_VERSION_0310 = 4.2 2) 创建自定义构建设置 GCC_VERSION_0320 = com.apple.compilers.llvmgcc42 3)将 GCC_VERSION 定义为 $(GCC_VERSION_$(XCODE_VERSION_MINOR))
    • 当我尝试这样做时,我看到了这个:i.imgur.com/nwp6t8D.png 拱门在哪里?
    • @NathanFiscaletti 在 Xcode 10 上,Any iOS Simulator SDK 用于模拟器,Any iOS SDK 用于“设备”(“拱门”)。
    【解决方案2】:

    您有 3 个选项:

    1. 如果您控制单击检查窗口内的构建设置名称(您可以在其中更改编译器设置等),它将带来一个对该设置进行条件化的选项。只需转到您要更改的链接器标志,并通过 SDK 对其进行条件化,然后输入每个 SDK 的特定库。

    2. 或者,您可以获取库并将其安装在每个 SDK 根目录中的相同路径(“/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/”和“/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/usr/lib”)。由于使用了 SDK 相对库搜索路径,因此将为任一构建引入适当的版本。

    3. 您可以将两个库合并为一个胖库。这可能是个坏主意,但如果你想这样做,请查看manpage

    【讨论】:

    • lipo'ing 到一个胖库不是必然一个坏主意,b/c 任何未使用的架构都会被删除。它本质上与仅链接到瘦库相同。我能看到的唯一缺点是从通用胖库中提取当前拱门可能需要额外的几秒钟。我个人在我的项目中使用了几个自定义的 lipo'd fat lib,因为它减少了 Xcode 需要索引的文件数量以及我必须考虑的文件总数)。不过答案很好!
    【解决方案3】:

    如果有人遇到“[lib_for_sim_or_device] 不是为架构构建...”之类的警告,则在将 3rd 方库文件夹拖入项目时会出现警告。

    在后台,XCode 会自动将库文件添加到“目标设置 -> 构建短语 -> 将二进制文件与库链接”部分,从而导致与两个库的链接。

    要解决此问题,请从“将二进制文件与库链接”中删除这些条目,然后按照上面关于 sim/device 的条件构建设置的指南进行操作

    希望对您有所帮助!

    【讨论】:

      【解决方案4】:

      推荐的方法是不要将库添加到您的项目和目标中,而是设置其他链接器标志以包含对每个配置的链接库的单独直接引用。

      调试:

        OTHER_LINKER_FLAGS = -l/Path/To/My/Debug/Library.dylib
      

      发布

        OTHER_LINKER_FLAGS = -l/Path/To/My/Release/Library.dylib
      

      您当然可以使用对其他构建设置的引用来使这些路径相对于持久的东西,或者使用源树到外部源树。

      【讨论】:

      • 这没有回答问题。问题是关于设备/模拟器,而不是调试/发布。我们经常会得到两个基于目标设备/模拟器的库。
      • 公平地说,在 2009 年 7 月我发布回复时,构建设置条件并不存在,而使用配置是唯一的方法。
      【解决方案5】:

      对于 Xcode 3.2.1 中的选项 1(请参阅 Louis Gerbarg 答案),选择“其他链接器标志”,然后从构建设置窗口左下方的下拉菜单中选择“添加构建设置条件”。有关“其他链接器标志”语法,请参阅 cdespinosa 答案)

      或者,如果您将设备/模拟器库放在单独的目录中,您也可以“添加构建设置条件”到“库搜索路径”。

      【讨论】:

        【解决方案6】:

        其他链接器标志和添加库的问题在于控制库的链接顺序,这很重要。似乎链接器标志版本意味着这些库将首先出现,因此如果您在 xcode 中管理必须首先出现的其他库,那么您必须放弃它并将所有内容移至其他链接器标志......!-P

        【讨论】:

          【解决方案7】:

          在我的 XCode 3.2.3 中,正确的命名似乎是 OTHER_LDFLAGS,而不是 OTHER_LINKER_FLAGS。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-09-04
            • 2012-04-23
            • 1970-01-01
            • 2022-06-20
            • 1970-01-01
            • 1970-01-01
            • 2013-01-08
            • 1970-01-01
            相关资源
            最近更新 更多