Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 如何使用不同的工具链_Cmake_Cross Platform - Fatal编程技术网

Cmake 如何使用不同的工具链

Cmake 如何使用不同的工具链,cmake,cross-platform,Cmake,Cross Platform,在项目中,一些目标将在构建平台上构建和运行,而其他目标将为跨平台构建;使用cmake时,我们有哪些选项 目前我使用CMAKE\u BUILD\u TYPE来定义工具链、构建类型和平台(例如-D CMAKE\u BUILD\u TYPE=arm\u debug)。在构建中的一个地方,我根据CMAKE_build_TYPE的值切换工具(编译器、链接等)、命令行标志、库等。对于每种构建类型,我都创建一个构建目录 这种方法有它的缺点:多个构建目录,并且没有简单的方法将一个构建类型中的一个目标依赖于另一个

在项目中,一些目标将在构建平台上构建和运行,而其他目标将为跨平台构建;使用cmake时,我们有哪些选项

目前我使用
CMAKE\u BUILD\u TYPE
来定义工具链、构建类型和平台(例如
-D CMAKE\u BUILD\u TYPE=arm\u debug
)。在构建中的一个地方,我根据CMAKE_build_TYPE的值切换工具(编译器、链接等)、命令行标志、库等。对于每种构建类型,我都创建一个构建目录

这种方法有它的缺点:多个构建目录,并且没有简单的方法将一个构建类型中的一个目标依赖于另一个构建类型中的目标(例如,跨平台的构建在构建平台上需要某种预编译器)

由于目前每个构建目标都有一个要使用的工具链,我希望将目标与目标平台/工具集相关联。这意味着必须使用不同的工具集为多个目标平台构建一些库。

对于“每个CMake运行一个构建类型和平台”的限制是基本的,我强烈建议不要尝试解决它

在我看来,正确的解决方案似乎是将构建分为几个阶段。特别是,对于一种生成类型的目标依赖于另一种生成类型的目标的场景,您不应该尝试将这两个目标放在同一个CMake项目中。适当的模块化是关键。有效使用CMake的
include
命令有助于避免构建脚本中的代码重复

这种方法的最大缺点是构建过程变得更加复杂,因为您现在有几个相互依赖的CMake项目,它们需要以特定的顺序和特定的配置构建。尽管您似乎已经远远超出了使用单个命令构建整个系统的范围。CMake可以通过以下工具帮助管理这种复杂性,例如,允许您从另一个项目中构建CMake项目。根据您的特定设置,使用您喜爱的脚本语言编写的非CMake层也可能是一种可行的替代方法,以确保以正确的顺序构建不同的子项目


不幸的是,复杂的构建设置很难管理。CMake在提供许多工具来解决这一复杂性方面做得很好,但它无法神奇地使问题变得更容易。CMake对其用户施加的大多数限制都是有原因的,即如果您尝试在没有这些限制的情况下工作,事情会变得更加困难。

非常感谢您提供的非常有用的答案!