编译ApplicationTests单元测试包时,为什么这段代码不起作用?
#if TARGET_OS_IPHONE
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#else
#import <Cocoa/Cocoa.h>
#endif
我的一个依赖项有这个检查并在我的主应用程序包中编译得很好,但它在编译我的ApplicationTests包时尝试加载<Cocoa/Cocoa.h>
。这可能只是我对Xcode缺乏了解,但是当我的测试包没有构建时我会感到紧张。有什么建议吗?
答案 0 :(得分:30)
您需要添加
#import "TargetConditionals.h"
来源:https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-8A428/TargetConditionals.h.auto.html
答案 1 :(得分:14)
最简单的解决方案是在#import <Foundation/Foundation.h>
条件下移出#if
语句并用AppKit替换Cocoa:
#import <Foundation/Foundation.h>
#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#else
#import <AppKit/AppKit.h>
#endif
Foundation伞头导入NSObjCRuntime头,后者又导入TargetConditionals头。
答案 2 :(得分:13)
我遇到了类似的问题:构建静态库时未定义TARGET_OS_IPHONE
。我的解决方案是将“-DTARGET_OS_IPHONE
”添加到目标构建选项的“Other C Flags
”部分。
答案 3 :(得分:0)
虽然它可能会损害编译时间,但它不会造成任何性能损失。也就是说,对于Objective C来说,这不是一个真正的问题。但是,在处理C ++类时,它确实会受到伤害。
答案 4 :(得分:0)
我在 Xcode 12.5 中的解决方案是在构建设置或 .xcconfig 文件中将 TARGET_OS_IPHONE
或 TARGET_OS_IPHONE=1
添加到 GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS
。
详情:
更新到 Xcode 12.5 beta 后,现在尝试构建 iRate 1.12.2 时 carthage bootstrap
将失败。我查看了carthage构建日志,导致失败的错误是:
error: 'TARGET_OS_IPHONE' is not defined, evaluates to 0 [-Werror,-Wundef-prefix=TARGET_OS_]
对我来说,问题是 iRate 不再处于开发阶段,我宁愿不 fork iRate 只是为了覆盖一些损坏的构建设置。
但是,我从 Carthage 的人那里学到了一个巧妙的解决方法:您可以使用任何 .xcconfig 文件通过设置环境变量 XCODE_XCCONFIG_FILE=path/to/my.xcconfig
来覆盖任何项目的构建设置在运行 xcodebuild
之前。该 .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 依赖项的构建设置,则该脚本也可以调用 xcodebuild
,而不是 carthage
。它可能也适用于 CocoaPods pod
命令(我不确定)。
答案 5 :(得分:-1)
两者都很好
#import "TargetConditionals.h"
#import <Foundation/Foundation.h>
<Foundation/Foundation.h>
|
└-#import <Foundation/NSObjCRuntime.h>
|
└- #include <TargetConditionals.h>
|
└- defined TARGET_OS_IPHONE