代码之家  ›  专栏  ›  技术社区  ›  noamtm

xcode:基于架构的条件构建设置(设备(ARM)vs模拟器(i386)

  •  24
  • noamtm  · 技术社区  · 15 年前

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

    我该怎么做?我来自VisualC++,所以我是XCODE的新手,我找不到办法。

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

    7 回复  |  直到 9 年前
        1
  •  28
  •   Community CDub    7 年前

    我在集成Adobe 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 解释在Xcode4中设置条件生成设置的新方法。 提示: “生成设置”选项卡上的文本字段已启用拖放功能;在其他链接器标志下准备好编辑条件生成设置后,可以直接将静态库文件拖到文本字段上,Xcode将自动输入(希望是相对的)路径。

    以下是我的其他链接器标志的屏幕截图,当我得到“缺少所需的架构i386”警告时,不要出现构建错误:

    enter image description here γ

        2
  •  9
  •   Louis Gerbarg    15 年前

    您有3个选项:

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

    2. 或者,您可以在每个sdks根目录(“/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 .

        3
  •  5
  •   user746403    11 年前

    如果有人遇到这样的警告:“不是为体系结构构建的[lib_for_sim_or_device]”,则在将第三方库文件夹拖到项目中时会出现警告。

    在场景的后面,Xcode会自动将库文件添加到“target setting->build phrases->link binary with libraries”部分中,这会导致与两个库链接。

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

    希望它有帮助!

        4
  •  3
  •   cdespinosa Martin Cote    15 年前

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

    调试:

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

    为了释放

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

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

        5
  •  1
  •   zaph    15 年前

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

    或者,如果设备/模拟器库位于不同的目录中,也可以将构建设置条件“添加到”库搜索路径中。

        6
  •  1
  •   Peter    15 年前

    其他链接器标志和在其中添加库的问题在于控制库的链接顺序,这一点很重要。似乎链接器标志版本意味着这些库将首先出现,所以如果您在Xcode中管理必须先出现的其他库,则必须放弃该库并将所有内容移到其他链接器标志中…!-P

        7
  •  0
  •   opyh    14 年前

    在我的Xcode3.2.3中,正确的命名似乎是其他的_ldflags,而不是其他的_linker_标志。