我正在将第三方库导入到我正在创建的动态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应用程序。
答案 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
请注意,这些宏始终是定义的,并且设置为1
或0
。
另请注意,TARGET_OS_MAC
已定义并设置为1
,适用于MacOS,iOS,watchOS和tvOS版本。
通常,您需要测试宏是否等于值1 - 只测试它们是否已定义(例如:#ifdef TARGET_OS_IOS
)不正确。
答案 1 :(得分:1)
我有一种感觉,因为你在你的macs硬件上运行的模拟器上运行,因此它是x86_64而不是arm64,而generic iOS device
运行时为实际设备的arm架构编译它。
看起来似乎有点缺点ifdef虽然......