如何避免#ifdef __x86_64__

时间:2016-04-19 05:44:35

标签: ios xcode macos cocoa

我正在将第三方库导入到我正在创建的动态iOS框架中。但是,该库在其标题之一中包含以下内容:

#ifdef __x86_64__
    #import <Cocoa/Cocoa.h>
#else
    #import <UIKit/UIKit.h>
#endif

这会导致问题,因为我支持的平台是iOS,因此设备编译失败,错误为Cocoa/Cocoa.h file not found

如果我将其更改为generic iOS device并构建,则可行,但我不明白为什么。

我尝试将Build Active Architecture Only设置为NO,但仍会出现相同的错误。

我能做些什么来为64位iPhone设备编译吗?出于某种原因,该库的创建者认为64位意味着它应该是OSX应用程序。

2 个答案:

答案 0 :(得分:3)

第三方库中的条件语句没有意义:__x86_64指定目标CPU,而不是目标的相应操作系统。

为Mac OS vs [iOS,watchOS,tvOS]和可能的模拟器进行条件编译:

#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR
    #import <UIKit/UIKit.h>
#else /* assuming Mac OS */
    #import <Cocoa/Cocoa.h>
#endif

这些宏在每个SDK的标头TargetConditionals.h中定义。以下是标题的摘录:

TARGET_OS_* 
These conditionals specify in which Operating System the generated code will
run.  Indention is used to show which conditionals are evolutionary subclasses.  

The MAC/WIN32/UNIX conditionals are mutually exclusive.
The IOS/TV/WATCH conditionals are mutually exclusive.


    TARGET_OS_WIN32           - Generated code will run under 32-bit Windows
    TARGET_OS_UNIX            - Generated code will run under some Unix (not OSX) 
    TARGET_OS_MAC             - Generated code will run under Mac OS X variant
       TARGET_OS_IPHONE          - Generated code for firmware, devices, or simulator 
          TARGET_OS_IOS             - Generated code will run under iOS 
          TARGET_OS_TV              - Generated code will run under Apple TV OS
          TARGET_OS_WATCH           - Generated code will run under Apple Watch OS
       TARGET_OS_SIMULATOR      - Generated code will run under a simulator
       TARGET_OS_EMBEDDED       - Generated code for firmware

请注意,这些宏始终是定义的,并且设置为10

另请注意,TARGET_OS_MAC已定义并设置为1,适用于MacOS,iOS,watchOS和tvOS版本。

通常,您需要测试宏是否等于值1 - 只测试它们是否已定义(例如:#ifdef TARGET_OS_IOS)不正确。

答案 1 :(得分:1)

我有一种感觉,因为你在你的macs硬件上运行的模拟器上运行,因此它是x86_64而不是arm64,而generic iOS device运行时为实际设备的arm架构编译它。

看起来似乎有点缺点ifdef虽然......