xcode - 如何在 Xcode 中为派生源禁用 ARC?

标签 xcode bison flex-lexer

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

(具体原因是因为YYSTYPEid我项目的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/

相关文章:

ios - 如何创建一个包含符合协议(protocol)的对象的元组?

c - Flex/Bison 多遍类解析

c - Bison 语法/解析器的多个起点

c++ - Bison C++ : error expected initializer before ‘*’ token

iphone - 应用程序未手动启动

iphone - xcode 5 : What's the best way to go back and forth between top of editor and where you were before?

iphone - iOS 6 iPhone 应用程序——如何仅缩放到用户位置一次?

memory-leaks - flex/bison 使用意外标记修复内存泄漏

regex - 带有句点 "."的 Flex 规则未编译

regex - jflex 最有效的前瞻替代品