Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode项目模板中的每个文件编译器标志_Xcode_Templates_Plist - Fatal编程技术网

Xcode项目模板中的每个文件编译器标志

Xcode项目模板中的每个文件编译器标志,xcode,templates,plist,Xcode,Templates,Plist,我正在构建一个新的Xcode项目模板,我想包括一个非ARC的库。但是我的整个项目都是ARC,因此构建项目的唯一方法是在该库中的文件上指定编译器标志(-fno objc ARC) 如何在Xcode项目模板中执行此操作? 我尝试在定义字典中的特定文件上设置它,作为COMPILER\u标志和CompilerFlag。它们都不起作用 我绝对没有找到关于这方面的文档,但我非常确定这是可以做到的 更新: 苹果公司回复了我的支持请求,表示目前没有办法做到这一点。所以不幸的是,在他们最终对模板和文档做些什么之前

我正在构建一个新的Xcode项目模板,我想包括一个非ARC的库。但是我的整个项目都是ARC,因此构建项目的唯一方法是在该库中的文件上指定编译器标志(
-fno objc ARC

如何在Xcode项目模板中执行此操作?
我尝试在
定义
字典中的特定文件上设置它,作为COMPILER\u标志和CompilerFlag。它们都不起作用

我绝对没有找到关于这方面的文档,但我非常确定这是可以做到的

更新:
苹果公司回复了我的支持请求,表示目前没有办法做到这一点。所以不幸的是,在他们最终对模板和文档做些什么之前,我们运气不好

更新2:

我已经知道如何通过使用BuildPhases脚本来解决这个问题,该脚本将检查Xcode项目并添加所需的标志。我将很快发布答案。

您可以在项目构建阶段>编译源代码中添加此标志,如下面的屏幕截图所示。将此标志置于此库的所有.m文件中:


好的,尽管苹果公司给了我负面的回应(他们的模板解析器不支持这个),我还是找到了一种方法

我基本上会在模板运行脚本中添加新的构建阶段。此脚本将使用
-fno objc arc
标记所需文件,然后从项目中删除自身

以下是添加标志的方式:

PROJ_FILE="${PROJECT_FILE_PATH}/project.pbxproj"
STR_SRCH="\* Class.m \*\/"
STR_RPLC="\* Class.m *\/; settings = {COMPILER_FLAGS = \"-fno-objc-arc\"; };"
sed -i "" "s|${STR_SRCH};|${STR_RPLC}|g" "$PROJ_FILE"
然后以类似的方式扫描项目文件并删除构建阶段(使用脚本),这样就不会每次都运行它


我将很快用完整的代码更新此答案。

在尝试确保脚本在初始构建后不会运行后,我已完成以下操作:

 echo "Adding compiler flags"
PROJ_FILE="${PROJECT_FILE_PATH}/project.pbxproj"

STR_SRCH="SomeClass.m \*/; };"
STR_RPLC="SomeClass.m \*/; settings = {COMPILER_FLAGS = \"-fobjc-arc\"; }; };"

if grep "${STR_SRCH}" "$PROJ_FILE"
then
    sed -i "" "s|${STR_SRCH}|${STR_RPLC}|g" "$PROJ_FILE"
else
    exit 0
fi

grep将确保我有确切的字符串要替换。否则,我假设已经添加了fobjc arc标志,并且不再需要该脚本。这使我能够在不删除实际脚本的情况下运行构建。

我知道此页面很旧,但我想提供我对提供的脚本的看法:

echo "Checking compiler flags."
PROJ_FILE="${PROJECT_FILE_PATH}/project.pbxproj"

REQUIRE_ARC=("File1ThatNeedsARC.m" "File2ThatNeedsARC.m")
REQUIRE_NO_ARC=("File1ThatNeedsARC.m" "File2ThatNeedsARC.m")

STR_TEST_CASE="File1ThatNeedsARC.m \*/; };"

if grep "${STR_TEST_CASE}" "$PROJ_FILE"
then
echo "Adding compiler flags."
for file in ${REQUIRE_ARC[@]}
do
STR_SRCH_ARC=$file" \*/; };"
STR_RPLC_ARC=$file" \*/; settings = {COMPILER_FLAGS = \"-fobjc-arc\"; }; };"
if grep "${STR_SRCH_ARC}" "$PROJ_FILE"
then
sed -i "" "s|${STR_SRCH_ARC}|${STR_RPLC_ARC}|g" "$PROJ_FILE"
fi
done
for file in ${REQUIRE_NO_ARC[@]}
do
STR_SRCH_NOARC=$file" \*/; };"
STR_RPLC_NOARC=$file" \*/; settings = {COMPILER_FLAGS = \"-fno-objc-arc\"; }; };"
if grep "${STR_SRCH_NOARC}" "$PROJ_FILE"
then
sed -i "" "s|${STR_SRCH_NOARC}|${STR_RPLC_NOARC}|g" "$PROJ_FILE"
fi
done
else
echo "Compiler flags already added."
exit 0
fi
只需使用.m文件适当地更新数组REQUIRE_ARC和REQUIRE_NO_ARC(内容以空格分隔)。 同时更新测试用例STR_test_case

此脚本应添加到xcode项目的构建阶段(编辑器>添加构建阶段>添加运行脚本构建阶段)(在编译源代码上方)

感谢大家对本脚本的帮助

-

对不起,我已经知道了。我在问如何在创建Xcode项目模板时做到这一点。然后你的问题的答案是否定的,除了一些变通方法,我现在已经得到苹果的确认。这真的是不可能的。在编译器运行之前,如何让它运行?我的构建失败,因为编译在运行实际运行脚本之前检查了我的“编译源代码”。我还试着在“编译源代码”之前将脚本拖到行中,我只是在之前将其拖到行中,仅此而已。应该可以。你是如何用脚本删除构建阶段的?我已经自动添加了编译器标志,但是当我尝试运行构建时,它只是取消了。它仅在我删除运行脚本后运行。我想知道如何将其保留在构建阶段列表中这是一个好主意+1美元。如果你不介意有一个额外的构建阶段,那么这将是一个不错的选择。您还可以将echo移动到if条件之后,这样它只在实际添加编译器标志时才会打印出来。