24

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

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

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

4

6 回答 6

38

您需要添加

#include <TargetConditionals.h>

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

于 2012-06-21T20:54:11.730 回答
19

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

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

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

于 2015-10-28T22:09:18.937 回答
15

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

于 2010-09-20T02:28:24.473 回答
0

两者都运作良好

  • #import "TargetConditionals.h"
  • #import <Foundation/Foundation.h>
<Foundation/Foundation.h> 
    |
    └-#import <Foundation/NSObjCRuntime.h>
        |
        └- #include <TargetConditionals.h> 
                |
                └- defined TARGET_OS_IPHONE
于 2020-05-21T08:11:56.570 回答
0

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

细节:

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

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

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

但是,我从CarthageXCODE_XCCONFIG_FILE=path/to/my.xcconfig的人们那里学到了一个绝妙的解决方法:您可以在运行之前通过设置环境变量来覆盖使用任何 .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它也可能适用于 CocoaPodspod命令(我不确定)。

于 2021-02-13T23:16:58.517 回答
0

注意:在 Swift 中必须使用:

#if os(iOS)
于 2021-11-24T02:40:32.840 回答