将版本号添加到XCode命令行实用程序C ++项目

时间:2011-10-28 05:19:02

标签: objective-c xcode xcodebuild

我使用Objective-C在XCode中创建了一个Command Line Utility C ++工具。我希望版本号显示在创建的可执行文件的Info中。所以我在 <的 当前项目版本 字段中添加了版本号 1.0.0.0 em>构建设置 。但是,当我构建它时,版本号不会添加到创建的 'Unix可执行文件'

我错过了什么吗? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:5)

不幸的是,从版本3开始,Xcode本身不会将当前项目版本嵌入到可执行文件中。我不确定Xcode 4中是否已更改。

几年前我遇到了这个问题。事实证明:

  1. Finder中显示的版本号来自应用程序的Info.plists。对于应用程序包,Info.plist是一个文件。在可执行文件的情况下,它必须嵌入在__TEXT部分中。 Info.plist的格式无论如何都是相同的。

  2. Xcode没有一键支持将Info.plists嵌入到可执行文件中,但它是可能的。

  3. Xcode不会预处理Info.plist文件,除非它们进入应用程序包(例如插入CURRENT_PROJECT_VERSION的值)。

  4. 我破解了一个解决方案,但它没有完成,可能并不代表最佳实践。

    首先,我创建了一个名为Info_template.plist的新的库存Info.plist文件。我将CFBundleVersion设置为${CURRENT_PROJECT_VERSION},将CFBundleShortVersionString设置为${CURRENT_MARKETING_VERSION}

    然后,我在构建开始时添加了一个名为“Preprocess Info.plist”的运行脚本阶段,使用/bin/sh作为shell,使用以下脚本:

    set -u
    
    if ! [[ ${CURRENT_PROJECT_VERSION:-""} && ${CURRENT_MARKETING_VERSION:-""} ]]; then
        echo "Version numbers are not set" >&2
        exit 1
    fi
    # Ghetto environment variable expansion, since Xcode does not appear to have built-in expansion for arbitrary files
    { echo "cat <<EOF"
      cat ${SRCROOT}/Info_template.plist
      echo "EOF"
    } | sh > ${DERIVED_FILES_DIR}/Info.plist
    

    我在其输出文件中添加了$(DERIVED_FILE_DIR)/Info.plist

    然后,我打开了目标的构建设置,并将其添加到Other Linker Flags:

    -sectcreate __TEXT __info_plist ${DERIVED_FILE_DIR}/Info.plist
    

    这要求链接器将生成的Info.plist文件滚动到可执行文件中。

    让我知道这对你有用,或者我遗漏了什么!