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