Ios 如何避免#ifdef uux86 64__

Ios 如何避免#ifdef uux86 64__,ios,xcode,macos,cocoa,Ios,Xcode,Macos,Cocoa,我正在将第三方库导入我正在创建的动态iOS框架中。但是,库的其中一个标题中包含以下内容: #ifdef __x86_64__ #import <Cocoa/Cocoa.h> #else #import <UIKit/UIKit.h> #endif \ifdef\uuux86\u64__ #进口 #否则 #进口 #恩迪夫 这会导致问题,因为我支持的平台是iOS,所以为设备编译失败,出现错误Cocoa/Cocoa.h file not found 如果我把

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

#ifdef __x86_64__
    #import <Cocoa/Cocoa.h>
#else
    #import <UIKit/UIKit.h>
#endif
\ifdef\uuux86\u64__
#进口
#否则
#进口
#恩迪夫
这会导致问题,因为我支持的平台是iOS,所以为设备编译失败,出现错误
Cocoa/Cocoa.h file not found

如果我把它改成
通用iOS设备
并编译,它会工作,但我不明白为什么

我尝试将
buildactivearchitecture Only
设置为NO,但仍然会出现相同的错误


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

我有一种感觉,因为您运行的是在Mac硬件上运行的模拟器,因此它是x86_64,而不是arm64,当它作为
通用iOS设备运行时,
为实际设备的arm架构编译它


虽然ifdef似乎有点缺点…

我有一种感觉,这是因为您在Mac硬件上运行的模拟器上运行,因此它是x86_64,而不是arm64,而运行时是作为
通用iOS设备
为实际设备的arm架构编译它


虽然ifdef似乎有点缺点…

第三方库中的条件语句毫无意义:
\uuux86\u64
指定目标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
请注意,这些宏始终是定义的,可以设置为
1
0

还请注意,对于MacOS、iOS、watchOS和tvOS构建,定义了
TARGET\u OS\u MAC
,并将其设置为
1


通常,您需要测试宏是否等于值1——仅测试它们是否已定义(例如:
\ifdef TARGET\u OS\u IOS
)是不正确的。

第三方库中的条件语句毫无意义:
\u x86\u 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
请注意,这些宏始终是定义的,可以设置为
1
0

还请注意,对于MacOS、iOS、watchOS和tvOS构建,定义了
TARGET\u OS\u MAC
,并将其设置为
1



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

它是否在设备上实际发生故障?或者您是在模拟器上运行库是否实际使用用户界面组件?如果您尝试导入
#导入“Foundation/Foundation.h”
,会怎么样?它是第三方库,因此我无法编辑它。它在编译时失败,无法运行ITI如果这是一个框架的公共头,而您没有源代码,那么以实际纠正它的方式编辑它仍然是安全的。但是,您不能神奇地将二进制文件包括在模拟器中。因此,如果您将其更改为
#如果TARGET#OS#u IPHONE#import#else#import#endif
——它应该是安全和正确的。那么您是说我可以在框架中编辑文件,即使我没有这些文件?它在设备上真的失败了吗?或者您是在模拟器上运行库是否实际使用用户界面组件?如果您尝试导入
#导入“Foundation/Foundation.h”
,会怎么样?它是第三方库,因此我无法编辑它。它在编译时失败,无法运行ITI如果这是一个框架的公共头,而您没有源代码,那么以实际纠正它的方式编辑它仍然是安全的。但是,您不能神奇地将二进制文件包括在模拟器中。因此,如果您将其更改为
#如果TARGET#OS#u IPHONE#import#else#import#endif
——它应该是安全和正确的。那么您是说我可以在框架中编辑文件,即使我没有这些文件?回答得好,但是你可能想要
#如果TARGET_OS_IPHONE | | TARGET_OS_SIMULATOR
。uu x86_64将被定义,如果你对64位设备使用iOS模拟器,那么事情就会出问题。对于32位MacOS X版本,它也将是未定义的,该版本将尝试包含UIKit,但其他人可能会担心:-)@gnasher729这是对我答案的评论吗?回答很好,但是你可能想要
#如果TARGET_OS_IPHONE | | TARGET_OS_SIMULATOR
。uu x86_64将被定义,如果你对64位设备使用iOS模拟器,那么事情就会出问题。对于32位MacOS X版本,它也将是未定义的,该版本将尝试包含UIKit,但其他人可能会担心:-)@gnasher729这是对我答案的评论吗?我无法运行它。编译失败。@dmoss18在iphone或模拟器上运行时?或者在为模拟器编译时,bothit失败,除非我将其设置为“通用iOS设备”。如果您获得一个实际的iOS设备并在那里运行,它应该可以工作。不管是谁创建了这个库,用这样的方式定义宏都有点愚蠢,我无法运行它。编译失败。@dmoss18在iphone或模拟器上运行时?或者在为模拟器编译时,bothit失败,除非我将其设置为“通用iOS设备”。如果您获得一个实际的iOS设备并在那里运行,它应该可以工作。创建该库的人定义这样的宏有点愚蠢