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 包时它会尝试加载 <Cocoa/Cocoa.h>
。这可能只是我对 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 <Foundation/Foundation.h>
语句移出,并将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 <Foundation/Foundation.h>
<Foundation/Foundation.h>
|
└-#import <Foundation/NSObjCRuntime.h>
|
└- #include <TargetConditionals.h>
|
└- defined TARGET_OS_IPHONE
【讨论】:
【参考方案5】:我在 Xcode 12.5 中的解决方案是在构建设置或 .xcconfig 文件中将 TARGET_OS_IPHONE
或 TARGET_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
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