Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1445|回复: 0
打印 上一主题 下一主题

CMake

[复制链接]

1272

主题

2067

帖子

7964

积分

认证用户组

Rank: 5Rank: 5

积分
7964
跳转到指定楼层
楼主
发表于 2021-10-17 17:12:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Qter 于 2021-10-17 17:44 编辑

https://blog.csdn.net/kai_zone/article/details/82656964


1, cmake 的介绍,下载,安装和使用

2, cmake 的手册详解,我关注了 -C和-G 的使用

3, 在Linux中构建cmake 的工程

第一个问题: cmake 介绍,下载和安装以及使用:https://fukun.org/archives/0421949.html

cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品。后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目。其官方网站是www.cmake.org,可以通过访问官方网站来获得更多关于cmake的信息,而且目前官方的英文文档比以前有了很大的改进,可以作为实践中的参考手册。

cmake的流行离不开KDE4的选择。KDE开发者在使用autotools近10年之后,终于决定为KDE4项目选择一个新的工程构建工具。之所以如此,用KDE开发者们自己话来说,就是:只有少数几个“编译专家”能够掌握KDE现在的构建体系。在经历了unsermake,scons以及cmake的选型和尝试之后,KDE4最终决定使用cmake作为自己的构建系统。在迁移过程中,进展一场的顺利,并获得了cmake开发者的支持。所以,目前的KDE4开发版本已经完全使用cmake来进行构建。

随着cmake 在KDE4项目中的成功,越来越多的项目正在使用cmake作为其构建工具,这也使得cmake正在成为一个主流的构建体系。

一、为何要使用项目构建工具?

为何要使用cmake和autotools之类的项目构建工具? 我想,这恐怕是刚刚接触软件项目的人最应该问的问题之一了。

“Hello, world!“这个最经典的程序相信我们每个人都写过。无论在什么平台下,编译和运行这个程序都仅需要非常简单的操作。但事实上,hello,world最多只能算是一个实例程序,根本算不上一个真正的软件项目。

任何一个软件项目,除了写代码之外,还有一个更为重要的任务,就是如何组织和管理这些代码,使项目代码层次结构清晰易读,这对以后的维护工作大有裨益。使想一下,如果把一个像KDE4那么大的项目像hello world那样,把全部代码都放到一个main.cpp文件中,那将会是多么恐怖的一件事情。别说KDE4,就是我们随便一个几千行代码的小项目,也不会有人干这种蠢事。

决定代码的组织方式及其编译方式,也是程序设计的一部分。因此,我们需要cmake和autotools这样的工具来帮助我们构建并维护项目代码。
看到这里,也许你会想到makefile,makefile不就是管理代码自动化编译的工具吗?为什么还要用别的构建工具?

其实,cmake和autotools正是makefile的上层工具,它们的目的正是为了产生可移植的makefile,并简化自己动手写makefile时的巨大工作量。如果你自己动手写过makefile,你会发现,makefile通常依赖于你当前的编译平台,而且编写makefile的工作量比较大,解决依赖关系时也容易出错。因此,对于大多数项目,应当考虑使用更自动化一些的 cmake或者autotools来生成makefile,而不是上来就动手编写。

总之,项目构建工具能够帮我们在不同平台上更好地组织和管理我们的代码及其编译过程,这是我们使用它的主要原因。

二、cmake的主要特点:

cmake和autotools是不同的项目管理工具,有各自的特点和用户群。存在即为合理,因此我们不会对两者进行优劣比较,这里只给出cmake的一些主要特点:
        1.开放源代码,使用类 BSD 许可发布。
        2.跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在 苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。
        3.能够管理大型项目,KDE4 就是最好的证明。
        4.简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。
        5.高效率,按照 KDE 官方说法,CMake 构建 KDE4 的 kdelibs 要比使用 autotools 来 构建 KDE3.5.6 的 kdelibs 快 40%,主要是因为 Cmake 在工具链中没有 libtool。
        6.可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。


四、从“Hello, world!”开始

了解cmake的基本原理并在系统中安好cmake后,我们就可以用cmake来演示那个最经典的”Hello, world!”了。

第一步,我们给这个项目起个名字——就叫HELLO吧。因此,第一部为项目代码建立目录hello,与此项目有关的所有代码和文档都位于此目录下。

第二步,在hello目录下建立一个main.c文件,其代码如下:

Example
  1. #include

  2.         int main(void)

  3.         {

  4.                 printf(”Hello,Worldn”);

  5.                 return 0;

  6.         }
复制代码

第三步,在hello目录下建立一个新的文件CMakeLists.txt,它就是 cmake所处理的“代码“。其实,使用cmake管理项目本身也是在编程,所以称之为“代码(或脚本)”并不为过。在CMakeLists.txt文件中输入下面的代码(#后面的内容为代码行注释):
        #cmake最低版本需求,不加入此行会受到警告信息
        CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
        PROJECT(HELLO) #项目名称
        #把当前目录(.)下所有源代码文件和头文件加入变量SRC_LIST
        AUX_SOURCE_DIRECTORY(. SRC_LIST)
        #生成应用程序 hello (在windows下会自动生成hello.exe)
        ADD_EXECUTABLE(hello ${SRC_LIST})

至此,整个hello项目就已经构建完毕,可以进行编译了。


第四步,编译项目。

为了使用外部编译方式编译项目,需要先在目录hello下新建一个目录build(也可以是其他任何目录名)。现在,项目整体的目录结构为:
        hello/
        |– CMakeLists.txt
         |– build /
        `– main.c

在windows下,cmake提供了图形界面,设定hello为source目录,build为二进制目录,然后点击configure即可开始构建,之后进入build目录运行make命令编译。

在linux命令行下,首先进入目录build,然后运行命令(注:后面的“..”不可缺少):

该命令使cmake检测编译环境,并生成相应的makefile。接着,运行命令make进行编译。编译后,生成的所有中间文件和可执行文件会在build目录下。 下面是我在ubuntu上的运行过程:

  1. $ ls
  2.         hello
  3.         $ cd hello/build/
  4.         $ ls
  5.         $ cmake ..
  6.         – The C compiler identification is GNU
  7.         – The CXX compiler identification is GNU
  8.         – Check for working C compiler: /usr/bin/gcc
  9.         – Check for working C compiler: /usr/bin/gcc — works
  10.         – Detecting C compiler ABI info
  11.          – Detecting C compiler ABI info - done
  12.         – Check for working CXX compiler: /usr/bin/c++
  13.         – Check for working CXX compiler: /usr/bin/c++ — works
  14.         – Detecting CXX compiler ABI info
  15.         – Detecting CXX compiler ABI info - done
  16.         – Configuring done
  17.         – Generating done
  18.         – Build files have been written to: /home/kermit/Project/cmake/hello/build
  19.         $ make
  20.         Scanning dependencies of target hello
  21.         [100%] Building C object CMakeFiles/hello.dir/main.c.o
  22.         Linking C executable hello
  23.         [100%] Built target hello
  24.         $ ls
  25.         CMakeCache.txt CMakeFiles cmake_install.cmake hello Makefile
  26.         $ ./hello
复制代码

上面,我们提到了一个名词,叫外部编译方式。其实,cmake还可以直接在当前目录进行编译,无须建立build目录。但是,这种做法会将所有生成的中间文件和源代码混在一起,而且cmake生成的makefile无法跟踪所有的中间文件,即无法使用”make distclean”命令将所有的中间文件删除。因此,我们推荐建立build目录进行编译,所有的中间文件都会生成在build目录下,需要删除时直接清空该目录即可。这就是所谓的外部编译方式。

第二个问题: cmake 的手册详解:http://www.cnblogs.com/coderfeng ... 16/CMake_ch_01.html


第三个问题:在Linux中使用cmake 构建应用程序: http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/

CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。CMake 提供了比 autoconfig 更简洁的语法。在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

  • 编写 CmakeLists.txt。
  • 执行命令“cmake PATH”或者“ccmake PATH”生成 Makefile ( PATH 是 CMakeLists.txt 所在的目录 )。
  • 使用 make 命令进行编译。




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-26 15:11 , Processed in 0.060655 second(s), 20 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表