我正在移植一个编译器项目以使用自动引用计数。我前段时间在 Xcode 中设置了该项目,它在没有 ARC 的情况下继续在 Xcode 4.6 中构建和运行良好。现在我已经将它的大部分移植到 ARC,但是我发现 Bison 和 Flex 生成的 Objective-C 文件需要禁用 ARC。
(具体原因是因为YYSTYPE
是id
我项目的pre-ARC版本。我可以声明它为__unsafe_unretained id
并且它会编译,但 ARC 编译代码不会将对象放入自动释放池中,其生命周期与我的旧非 ARC 代码相同,因此它会在运行时崩溃。)
但是,我不知道如何为生成的文件禁用 ARC。正常过程是将 --fno_objc_arc
选项添加到“构建阶段”选项卡中的特定 Objective-C 文件。当我尝试将该选项添加到 Flex 和 Bison 源文件时,构建失败,因为 Flex/Bison 不理解该选项。
生成的文件位于 DerivedSources 目录中,由 DERIVED_FILE_DIR
变量指向。但它们不会出现在 Xcode Project Navigator 或 Build Phases 选项卡中。我无法将它们添加到项目中,因为调试和发布版本之间的路径不同。所以我不知道如何将 --fno_objc_arc
应用到它们。
有没有人对在 Xcode 中为 Flex/Bison 派生源设置每个文件的构建选项有任何提示?
最佳答案
我想出了一个解决方法:
将 Bison/Flex 文件放在一个单独的 Xcode 目标中,并在该目标上禁用 ARC。这个“解析器”目标构建了一个静态库。 Flex 和 Bison 生成的 Objective-C 文件在此目标中编译。然后使这个目标成为项目中主要目标的依赖项,以便后者与解析器代码链接。
棘手的部分是让主要目标可以访问 Flex 和 Bison 生成的 header 。不能将它们标记为“公共(public) header ”,因为它们是生成的,而不是添加到项目中。因此,您需要将以下build设置添加到主要目标:
USER_HEADER_SEARCH_PATHS = $(CONFIGURATION_TEMP_DIR)/Parser.build/DerivedSources
(其中“解析器”是构建 Bison/Flex 文件的静态库目标的名称)
这个解决方案相当脆弱,因为它在build设置中对目标名称进行了硬编码。如果有人有在派生源上禁用 ARC 的真正解决方案,请发布。
关于xcode - 如何在 Xcode 中为派生源禁用 ARC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17121509/