首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >CMake:在XCode中生成和编译特定于体系结构的源文件

CMake:在XCode中生成和编译特定于体系结构的源文件
EN

Stack Overflow用户
提问于 2017-10-24 16:38:41
回答 2查看 1.1K关注 0票数 2

我有一个CMake项目,用于生成支持多CPU体系结构(arm64和armv7)的面向iOS的XCode项目。

我的CMake项目包括一些命令(用add_custom_command定义),这些命令将Lua脚本转换为C++源文件。这些生成的C++文件根据体系结构不同(不应为arm64编译armv7文件,反之亦然)。该工具的调用方式如下:

代码语言:javascript
代码运行次数:0
运行
复制
./data_tool --input <script> --output <C++ source> --architecture <armv7 or arm64>

我的(不正确的) CMake文件当前如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
foreach(ARCHITECTURE ${TARGET_ARCHITECTURES})
        string(
            REPLACE ".lua" ".cpp" GENERATED_CPP
            ${GENERATED_SOURCE_DIRECTORY}/${ARCHITECTURE}/${INPUT_SCRIPT}
        )

        add_custom_command(
                    OUTPUT ${GENERATED_CPP}
                    COMMAND ${DATA_TOOL} --input "${INPUT_SCRIPT}" --output "${GENERATED_CPP}" --architecture ${ARCHITECTURE}
                    MAIN_DEPENDENCY ${INPUT_SCRIPT}
        )
        list( APPEND GENERATED_SOURCE ${GENERATED_CPP} )
endforeach()

稍后,将GENERATED_SOURCE附加到传递给add_executable的源文件列表中。这段代码显然是错误的,因为armv7和arm64文件都是在为这两种体系结构构建时编译的。

我如何告诉CMake,每个体系结构编译一组不同的源文件?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-24 18:07:28

XCode没有一个很好的方法来排除基于正在构建的体系结构的文件。虽然这是可能的(请参阅Disabling some files in XCode project from compilation),但是通过CMake来设置它会有些困难。

相反,我建议让生成工具/脚本在整个文件周围设置预处理器保护,以支持生成的文件所支持的体系结构。这样,当XCode编译它们时,它们本质上将是空的,除了它们所要用于的体系结构。在这个答案(Determine if the device is ARM64)中,它展示了如何基于arm64进行条件编译(并对armv7使用反向编译)。

票数 3
EN

Stack Overflow用户

发布于 2017-10-24 17:29:15

好吧,不要把不同拱门的生成源放在同一个列表中。打开foreach主体,并对每个拱形重复这些命令。

如果不想引入代码复制,可以编写一个CMake function,它创建自定义命令并返回生成的源代码列表。有关如何从函数返回值,请参见this question

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46915776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档