TARGET_OS_IPHONE和ApplicationTests

时间:2010-09-18 16:42:55

标签: xcode gcc ios mgtwitterengine

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

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

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

6 个答案:

答案 0 :(得分:30)

答案 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_IPHONETARGET_OS_IPHONE=1 添加到 GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS

详情:

更新到 Xcode 12.5 beta 后,现在尝试构建 iRate 1.12.2carthage 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