TARGET_OS_IPHONE 和 ApplicationTests

Posted

技术标签:

【中文标题】TARGET_OS_IPHONE 和 ApplicationTests【英文标题】:TARGET_OS_IPHONE and ApplicationTests 【发布时间】:2011-04-14 03:21:25 【问题描述】:

为什么在编译 ApplicationTests 单元测试包时这段代码不起作用?

#if TARGET_OS_IPHONE
   #import <Foundation/Foundation.h>
   #import <UIKit/UIKit.h>
#else
   #import <Cocoa/Cocoa.h>
#endif

我的一个依赖项具有此检查,并且在我的主应用程序包中编译得很好,但是在编译我的 ApplicationTests 包时它会尝试加载 &lt;Cocoa/Cocoa.h&gt;。这可能只是我对 Xcode 缺乏了解,但是当我的测试包没有构建时,我会感到紧张。有什么建议吗?

【问题讨论】:

只是添加,导入uikit就不需要导入foundation 也许不是现在,而是 5 年前?也许吧。 可能甚至在 5 年前,因为 UIKit 中的所有元素都来自 NSObject => Foundation 框架 【参考方案1】:

你需要添加

#include <TargetConditionals.h>

来源:https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-8A428/TargetConditionals.h.auto.html

【讨论】:

在 watchOS Scheme 上运行时,我将所有 TARGET_OS_* 评估为 0。使用上述导入解决了问题【参考方案2】:

最简单的解决方案是在#if 条件下将#import &lt;Foundation/Foundation.h&gt; 语句移出,并将Cocoa 替换为AppKit,如下所示:

#import <Foundation/Foundation.h>
#if TARGET_OS_IPHONE
   #import <UIKit/UIKit.h>
#else
   #import <AppKit/AppKit.h>
#endif

Foundation 伞形标头导入 NSObjCRuntime 标头,后者又导入 TargetConditionals 标头。

【讨论】:

太棒了!这实际上应该被接受!【参考方案3】:

我遇到了类似的问题:TARGET_OS_IPHONE 在构建静态库时未定义。我的解决方案是将“-DTARGET_OS_IPHONE”添加到目标构建选项的“Other C Flags”部分。

【讨论】:

是的,这最终奏效了。我不确定我对不得不强迫这是真的感觉如何,但我想它是有效的。谢谢。 @MattBaker - 同样的问题,我同意! 这听起来像是错误的解决方案。您应该按照下面的 antho 建议进行操作,并包含 TargetConditionals.h。记录在这里:developer.apple.com/library/ios/#DOCUMENTATION/Xcode/Conceptual/… 这是在 Swift 测试目标中为我工作的解决方案。【参考方案4】:

两者都很好

#import "TargetConditionals.h" #import &lt;Foundation/Foundation.h&gt;
<Foundation/Foundation.h> 
    |
    └-#import <Foundation/NSObjCRuntime.h>
        |
        └- #include <TargetConditionals.h> 
                |
                └- defined TARGET_OS_IPHONE

【讨论】:

【参考方案5】:

我在 Xcode 12.5 中的解决方案是在构建设置或 .xcconfig 文件中将 TARGET_OS_IPHONETARGET_OS_IPHONE=1 添加到 GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS

详情:

更新到 Xcode 12.5 beta 后,现在 carthage bootstrap 在尝试构建 iRate 1.12.2 时会失败。我查看了carthage build log,导致失败的错误是:

error: 'TARGET_OS_IPHONE' is not defined, evaluates to 0 [-Werror,-Wundef-prefix=TARGET_OS_]

对我来说,问题是 iRate 不再处于开发阶段,我不想仅仅为了覆盖一些损坏的构建设置而分叉 iRate。

但是,我从Carthage 的人们那里学到了一个绝妙的解决方法:在运行@987654329 之前,您可以通过设置环境变量XCODE_XCCONFIG_FILE=path/to/my.xcconfig 来覆盖使用任何.xcconfig 文件的任何项目的构建设置@。该 .xcconfig 文件中的任何设置现在都将覆盖您使用 xcodebuild 构建的任何项目的设置。

此外,您可以通过调用的脚本而不是调用 xcodebuild 来动态执行此操作,例如:

#!/usr/bin/env bash

# Save this script as 'injectXcodeBuild.sh'
# Run it in place of xcodebuild (all arguments get forwarded through)
# The echo'd commands below will override any settings of the
# projects that get built by xcodebuild through this script.

set -euo pipefail

xcconfig=$(mktemp /tmp/static.xcconfig.XXXXXX)
trap 'rm -f "$xcconfig"' INT TERM HUP EXIT

echo 'GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS=TARGET_OS_IPHONE=1' >> $xcconfig

export XCODE_XCCONFIG_FILE="$xcconfig"

xcodebuild "$@"

如果您需要覆盖某些 Carthage 依赖项的构建设置,则此脚本可以调用 carthage 而不是 xcodebuild。它也可能适用于 CocoaPods pod 命令(我不确定)。

【讨论】:

【参考方案6】:

注意:在 Swift 中必须使用:

#if os(iOS)

【讨论】:

以上是关于TARGET_OS_IPHONE 和 ApplicationTests的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.IllegalStateException: Failed to load property source from location 'classpath:/applic

NSInteger 和 int 区别

int和NSInterger的区别

html 来自http://wiki.jikexueyuan.com/project/kendo-ui-development-tutorial/the-view-single-page-applic

html 来自http://wiki.jikexueyuan.com/project/kendo-ui-development-tutorial/the-view-single-page-applic

flask中的上下文 RuntimeError: No application found . Either work inside a view function or push an applic