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

Vik*_*ngh 1 xcode objective-c xcodebuild

我使用Objective-C在XCode中创建了一个Command Line Utility C++工具.我希望版本号显示在创建的可执行文件的Info中.所以我在Build设置Current Project Version字段中添加了版本号1.0.0.0.但是,当我构建它时,版本号不会添加到创建的"Unix可执行文件"中.

我错过了什么吗?谢谢您的帮助.

s4y*_*s4y 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的值).

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

首先,我创建了一个名为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
Run Code Online (Sandbox Code Playgroud)

我添加$(DERIVED_FILE_DIR)/Info.plist了它的输出文件.

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

-sectcreate __TEXT __info_plist ${DERIVED_FILE_DIR}/Info.plist
Run Code Online (Sandbox Code Playgroud)

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

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