我使用Objective-C在XCode中创建了一个Command Line Utility C ++工具。我希望版本号显示在创建的可执行文件的Info中。所以我在 <的 当前项目版本 字段中添加了版本号 1.0.0.0 em>构建设置 。但是,当我构建它时,版本号不会添加到创建的 'Unix可执行文件' 。
我错过了什么吗? 谢谢你的帮助。
答案 0 :(得分:5)
不幸的是,从版本3开始,Xcode本身不会将当前项目版本嵌入到可执行文件中。我不确定Xcode 4中是否已更改。
几年前我遇到了这个问题。事实证明:
Finder中显示的版本号来自应用程序的Info.plists。对于应用程序包,Info.plist是一个文件。在可执行文件的情况下,它必须嵌入在__TEXT部分中。 Info.plist的格式无论如何都是相同的。
Xcode没有一键支持将Info.plists嵌入到可执行文件中,但它是可能的。
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
我在其输出文件中添加了$(DERIVED_FILE_DIR)/Info.plist
。
然后,我打开了目标的构建设置,并将其添加到Other Linker Flags:
-sectcreate __TEXT __info_plist ${DERIVED_FILE_DIR}/Info.plist
这要求链接器将生成的Info.plist文件滚动到可执行文件中。
让我知道这对你有用,或者我遗漏了什么!