3

我正在移植一个编译器项目以使用自动引用计数。前段时间我在 Xcode 中设置了项目,它在没有 ARC 的 Xcode 4.6 中继续构建和运行良好。现在我已经将它的大部分移植到了 ARC,但我发现 Bison 和 Flex 生成的 Objective-C 文件需要禁用 ARC。

(具体原因是因为YYSTYPEid我的项目的 pre-ARC 版本。我可以将其声明为__unsafe_unretained id并且它会编译,但是 ARC 编译的代码不会将对象放入自动释放池中,其生命周期与我的旧非ARC 代码确实如此,因此它在运行时崩溃。)

但是,我不知道如何为生成的文件禁用 ARC。正常的过程是--fno_objc_arc在 Build Phases 选项卡中将选项添加到特定的 Objective-C 文件中。当我尝试将该选项添加到 Flex 和 Bison 源文件时,构建失败,因为 Flex/Bison 不理解该选项。

生成的文件位于DERIVED_FILE_DIR变量指向的 DerivedSources 目录中。但它们不会出现在 Xcode Project Navigator 或 Build Phases 选项卡中。我无法将它们添加到项目中,因为 Debug 和 Release 版本之间的路径不同。所以我不知道如何应用--fno_objc_arc到他们身上。

有没有人有任何关于在 Xcode 中为 Flex/Bison 派生源设置每个文件构建选项的提示?

4

1 回答 1

3

我想出了一个解决方法:

将 Bison/Flex 文件放在单独的 Xcode 目标中,并在该目标上禁用 ARC。这个“解析器”目标构建了一个静态库。Flex 和 Bison 生成的 Objective-C 文件在此目标中编译。然后让这个目标成为项目中主目标的依赖,以便后者与解析器代码链接。

棘手的部分是让 Flex 和 Bison 生成的标头可供主要目标访问。不能将它们标记为“公共标头”,因为它们是生成的,而不是添加到项目中的。因此,您需要将以下构建设置添加到主目标:

USER_HEADER_SEARCH_PATHS = $(CONFIGURATION_TEMP_DIR)/Parser.build/DerivedSources (其中“Parser”是构建 Bison/Flex 文件的静态库目标的名称)

这个解决方案相当脆弱,因为它在构建设置中硬编码了目标的名称。如果有人有在派生源上禁用 ARC 的真正解决方案,请发布。

于 2013-06-15T20:50:53.413 回答