为什么要使用cmake?

author author     2022-09-01     589

关键词:

  如果你曾经维护过软件包的构建和安装过程,你将对CMake感兴趣。CMake是软件项目的一个开源生成管理器,它允许开发人员以简单的可移植文本文件格式指定生成参数。然后,CMake 使用此文件为本机开发工具(包括Microsoft Visual Studio 、 Apple‘s Xcode)生成项目文件,以及unix、linux、nmake 和 borland各种类型的Makefiles文件。CMake处理构建软件的困难方面,如跨平台构建、系统内省以及用户自定义生产,使用户能够轻松地为复杂的硬件和软件系统量身定制构建。

  对于任何项目,特别是跨平台项目,一般需要一个统一的构建系统。许多项目都带有UNIX makefile和Microsoft Visual Studio工作区。这要求开发人员不断尝试保持两个构建系统的最新和一致。要将其他生成系统(如:Bordand和Xcode)作为目标,需要更多的自定义文件副本,从而造成更大的问题。如果你尝试支持可选组件 (如系统上有 libjpeg 可用的 jpeg 支持), 则会加剧此问题。cmake 通过将这些不同的操作合并成一个简单易懂的文件格式来解决这一难题。

  如果你有许多开发人员在一个项目或多个平台上工作,则该软件不得不构建在多台计算机上。考虑到安装一台现代计算机所涉及的软件和自定义选项的范围很广,有可能两台运行相同操作系统的两台计算机有可能略有不同。CMake为单平台多机开发环境提供了许多好处,其中包括:

    1、能够自动搜索正在构建的软件所需的程序、库和头文件。其中包括在搜索程序所需的环境变量以及Windows的注册表设置能力。

    2、在源文件树之外的目录树中构建的能力。这是许多UNIX平台上一个非常有用的特点。CMake将这一特点移植到了windows上,允许开发人员删除整个构建目录,而不用担心删除源文件。

    3、能够为自动生成的文件创建复杂的自定义命令,例如Qt的moc(qt.nokia.com), Insight Toolkit的CABLE封装生成器。这些命令用于在构建过程中生产的源文件,然后再编译到软件中。

    4、在配置时能够选择可选组件。例如,VTk的几个库是可选的,并且CMake为用户提供了一个简单的方法来选择生成的库。

    5、能够从简单的文本文件中自动生成工作区和项目。这对于具有许多程序或测试用例的系统来说非常方便,每个程序或测试用例都需要单独的项目文件,通常采用IDE手段创建是一个非常繁琐的过程。

    6、能够轻松地在静态和共享构建之间切换。CMake知道如何在支持的所有平台上创建共享库和模块。处理复杂的特定于平台的链接器标志,许多UNIX系统都支持诸如内置的运行时搜索的路径的共享释放器等高级功能。

    7、自动生成文件依赖关系,并支持大多数平台上的并行构建。

  在开发跨平台软件时,CMake提供了许多附加功能:

    1、测试机器字节顺序和其他硬件具体特性的能力。

    2、一组在所有平台上工作的构建配置文件。这避免了开发人员必须在项目中以几种不同格式维护相同信息的问题。

    3、支持在所有平台上构建共享库。

    4、使用系统相关信息配置文件的能力,例如数据文件的位置和其他信息。 CMake可以创建包含诸如数据文件的路径和其他信息的头文件,其格式为#define宏。 系统特定的标志也可以放置在配置的头文件中。 这比编译器的命令行-D选项有优势,因为它允许其他构建系统使用CMake构建的库,而不必指定在构建期间使用的完全相同的命令行选项。

1.1 CMake历史

  CMake开发于1999年开始,作为由美国国家医学图书馆资助的Insight Toolkit(ITK,www.itk.org)的一部分。 ITK是一个大型软件项目,可在许多平台上运行,并可与许多其他软件包进行交互。 为了支持这一点,需要一个功能强大但易于使用的构建工具。 过去与大型项目的构建系统合作,开发人员设计了CMake来满足这些需求。 此后,CMake不断增长并受到广泛的喜爱,许多项目和开发人员采用它的易用性和灵活性。 自1999年以来,CMake一直处于积极的发展之中,已经成熟,成为广泛构建问题的经过验证的解决方案。 最明显的例子就是成功应用了CMake作为K桌面环境(KDE)的构建系统,可以说是现有的最大的开源软件项目。

  CMake最近增加的其中之一是以CTest的形式包含软件测试支持。 测试软件的一部分过程涉及构建软件,可能安装软件,并确定软件的哪些部分适用于当前系统。 这使得CTest成为CMake的逻辑扩展,因为它已经拥有大部分信息。 类似地,一个新的CMake功能是CPack,它旨在支持软件的跨平台分发。 它为您的软件创建本机安装提供了跨平台的方法,利用现有的流行软件包,如NSIS,RPM,Cygwin和PackageMaker。

  其他最近添加到 cmake 包括支持苹果的 xcode ide 和支持微软的 visual studio 10。使用 cmake, 一旦您编写了输入文件, 您就可以获得对新编译器的支持, 并免费构建系统, 因为对它们的支持是建立在新的 relaeases 中的 cmake, 而不是与您的软件分发有关。另一个最近添加到 cmake 是支持交叉编译到其他操作系统或嵌入式设备。cmake 中的许多命令现在都能正确处理主机系统和目标平台在交叉 compling 时的差异。

1.2 为什么不使用Autoconf?

  在开发CMake之前,CMake的作者对现有的一些可用工具有经验。Autoconf与automake结合提供了与CMake相同的功能,但是在Windows平台上使用这些工具需要安装许多其他工具,而这些工具本来不属于Windows系统内。除了需要大量的工具外,autoconf 可能难以使用或扩展, 而且对于一些容易 cmake 的任务来说是不可能的即使你在系统上运行了 autoconf 及其所需的环境, 它也会生成Makefiles, 迫使用户使用命令行。另一方面, cmake 提供了一个选择, 允许开发人员生成可以直接从 ide 中使用的项目文件, windows 和 xcode 开发人员都习惯于此。

  虽然autoconf支持用户制定的选项,但它不支持依赖选项。其中一个选项依赖于某些其他属性或选择。例如,在CMake中,你可以使用用户选项来启用多线程处理,这取决于首先确定用户的系统是否具有多线程支持。CMake提供了一个交互式的用户界面,使用户可以方便地查看可用的选项以及如何设置它们。

  对于UNIX用户,CMake还提供了自动依赖生成,而autoconf无法直接完成。CMake的简单输入格式也比Makefile.in和configure.in文件的最和更容易阅读和维护。CMake具有记忆和链接库依赖信息的能力,这在autoconf/automake中也是没有等价性的。

1.3为什么不使用JAM,qmake,SCons,or ANT?

   其他工具,如:ANT, qmake, SCons 以及 JAM分别采用不同的方法来解决这些问题。他们帮助我们构建CMake。在这四个工具中,qmake与CMake最相识,但是它缺少CMake提供的大量的系统询问。qmake的输入格式与传统的Makefile更为密切相关。ANT,JAM和SCons也是跨平台的,但是它们不支持生成本地项目文件。ANT使用XML、JAM使用自己的语言,SCons使用python来摆脱传统的面向文件的输入。许多这些工具直接运行编译器,而不是让系统构建程序执行该任务。许多这些工具都需要其它工具,如python、java的安装才能工作。

1.4为什么不自己写脚本?

  一些项目使用现有的脚本语言(如Perl或Python)来配置构建过程。 尽管类似的功能可以通过这样的系统来实现,但过度使用工具可以使构建过程更像复活节彩蛋,而不是简单易用的构建系统。 在构建软件包时,用户被迫找到并安装版本4.3.2,并且3.2.4之前甚至可以启动构建过程。 为了避免这个问题,决定使用CMake不需要比用于构建的软件更多的工具。 至少使用CMake需要一个C编译器,该编译器的本机构建工具和一个CMake可执行文件,CMake是用C ++编写的,只需要一个C ++编译器来构建并且预编译的二进制文件可用于大多数系统。 脚本自己也通常意味着您不会生成本机Xcode或Visual Studio工作区,使Mac和Windows构建有限。

1.5 CMake可以在哪些平台上运行?

  CMake可以在各种平台上运行,包括Microsoft Windows,Apple Mac OS X以及大多数UNIX或类UNIX平台。 在撰写本书时,CMake在以下平台上进行了夜间测试:Windows 98/2000 / XP / Vista / 7,AIX,HPUX,IPIX,Linux,Mac OS X,Solaris,OSF,QNX,CYGWIN,MinGW ,和FreeBSD。 您可以查看www.cmake.org获取当前测试平台列表。

  同样,CMake支持大多数常见的编译器。 它支持所有CMake支持的平台上的GNU编译器。 其他测试编译器包括Visual Studio 6,10,Intel C,SGI CC,Mips Pro,Borland,Sun CC和HP aCC。 CMake应该适用于开箱即用的大多数UNIX样式编译器。

 

Qt 和 CMake 集成

...7.1CMake3.12.2我对在Qt中使用CMake有点陌生。我真的不知道我为什么要这样做,而不是仅仅使用QMake,因为QMake做了我需要做的一切。我的主要问题是,当我创建一个新项目并选择CMake作为构建工具时,QtCre 查看详情

cmake和makefile区别和cmake指定编译器(cmake-g)

...程序和库。下图时我画的各类工具之间的关系: 二为什么不直接使用项目编译链接工具?那为什么要有这三类工具,首先说下“项目编译链接工具”只是使用这些工具其实就能够编译出所有的目标,但由于命令... 查看详情

使用cmake构建复杂工程

...ake根据配置文件在生成Unix的Makefile或VS的solution文件等。1.为什么选CMake  别人为什么选CMake我不清楚,我是因为在Linux上直接写Makef 查看详情

如何在 CMake 项目中使用外部 DLL

】如何在CMake项目中使用外部DLL【英文标题】:HowtouseexternalDLLsinCMakeproject【发布时间】:2013-06-2022:50:14【问题描述】:我一直在互联网上搜索,但找不到任何可以回答我的问题的内容(或者我不知道要搜索什么)。无论如何,这... 查看详情

使用cmake进行交叉编译(代码片段)

cmake因为“又”要额外学一门语言而被诟病,但这并不妨碍越来越多私人项目用cmake来管理;autoconfig确实是更好的发行工具,但cmake管理项目确实挺方便。如果要应用这些cmake管理的项目到嵌入式环境中,必然涉及交叉编译... 查看详情

androidndkjni开发(工具:cmake)(代码片段)

为什么要使用NDK开发:实际的开发过程中会有业务需要使用Java与C/C++两者之间进行数据交互。很多的业务里都需要C/C++层拿到数据去调用Java层的方法,这两层之间的相互调用显得如此的重要,两层之间的... 查看详情

linux里用cmake安装的软件要怎么卸载

...下命令进行卸载rpm  -e   cmake以上cmake请使用实际的包名来替换2,如果是通过源码安装的,你可以进行cmake安装的目录,直接删除即可rm   -rf   /usr/local/cmake以上/usr/local/cmake请使用实际的安... 查看详情

为啥要在每个项目包配置之后包含(CPack)?

...题】:Whyshouldinclude(CPack)goaftertheperprojectpackageconfiguration?为什么要在每个项目包配置之后包含(CPack)?【发布时间】:2019-04-2612:16:20【问题描述】:我正在尝试使用CMake的CPack模块并得到一些令人困惑的行为。我有CpackMylib.cmake包... 查看详情

如何使用 atom 文本编辑器构建 cmake-project?

】如何使用atom文本编辑器构建cmake-project?【英文标题】:Howtobuildcmake-projectwithatomtexteditor?【发布时间】:2015-12-0909:32:40【问题描述】:我已经安装了build和build-make包,接下来要做什么并不明显。Build-tools包有漏洞,现在无法安... 查看详情

cmake使用笔记(代码片段)

记录CMake相关知识。Prelude:读文档一定要有耐心!问题一CLion:CMakeLists.txt中set(CMAKE_CXX_FLAGS-Wall)不起作用Solution:改用target_compile_options(mainPUBLIC-Wall)Reference:target_compile_optionsGCC:OptionstoRequestorSuppressWarni 查看详情

我为什么建议不要用cmake

作者:朱金灿来源:clever101的专栏CMake的优点  CMake在开源代码中最常见的应用场景之一是生成很多平台的makefile或者project文件,这种统一管理的方式确实有其方便之处。尽管CMake有一些优点,我依然不建议使用C... 查看详情

cmake使用入门

一、开胃菜hello目录下的文件结构:├──CMakeLists.txt├──hello.c├──hello.h└──main.cC代码见下节。最简单的cmake配置文件:project(HELLO)set(SRC_LISTmain.chello.c)add_executable(hello${SRC_LIST})如果要编译成gdb可调试的debug版本,则在配置... 查看详情

使用 cmake 构建外部库

】使用cmake构建外部库【英文标题】:Buildingexternallibrarieswithcmake【发布时间】:2016-11-1405:57:19【问题描述】:我正在使用cmake构建需要外部库的库。每个外部库都有自己的makefile。当我从我的CMakeLists.txt文件中调用这组命令时,什... 查看详情

使用 CMake 压缩文件?

】使用CMake压缩文件?【英文标题】:zipfilesusingCMake?【发布时间】:2011-08-1314:22:57【问题描述】:tl;dr版本:是否可以使用CMake(>=2.8)从某些文件生成zip文件并将打包的zip文件放在特定位置?更长的版本:我有一个CMakeLists.txt,... 查看详情

cmake使用教程(代码片段)

为什么需要CMake如果你一直在windows平台上开发,使用最多的可能就是VS的开发环境,它已经集成了全套的开发环境包括构建编译等。你或许听过好几种Make工具,例如GNUMake,QT的qmake,微软的MSnmake,BSDMake(pmake),Makepp,等等。这... 查看详情

如何使用mingwgfortran通过cmake构建/编译fortran

参考技术A第一步:将程序写成函数的形式,用参数规范接口,所要编译的函数要写成SUBROUTINE的格式---------------------------------------------------------------SUBROUTINET96_01(IOPT,PARMOD,PS,X,Y,Z,BX,BY,BZ)本回答被提问者采纳 查看详情

cmake学习:使用camke创建一个最简单的跨平台c++项目(代码片段)

使用camke创建一个最简单的跨平台项目什么是CMake为什么选择cmakeCMakeLists.txt使用cmake创建一个简单的工程项目须知:我是在Windows环境下实验的。什么是CMakeCMake是一个跨平台的编译、安装、测试以及打包工具;CMake不直接编... 查看详情

如何使用 cmake 正确链接库?

...器错误,尽管LIBB已成功形成并且APP可执行文件只需要LIBB为什么在尝试构建APP时会抛出需要LIBD的链接 查看详情