cmake使用教程

一、基础知识

1、编译器
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)

高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言 (High-level language), 如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。

—首先编译器进行语法分析,也就是要把那些字符串分离出来。
—然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。
—最后生成的是目标文件,也称为obj文件。
—再经过链接器的链接就可以生成最后的EXE文件了。
—有些时候需要把多个文件产生的目标文件进行链接,产生最后的代码。这一过程称为交叉链接。
2、Makefile
一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员。在 Linux(unix )环境下使用GNU 的make工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要我们投入一些时间去完成一个或者多个称之为Makefile 文件的编写。

所要完成的Makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile 的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的 Makefile。编译整个工程你所要做的唯一的一件事就是在shell 提示符下输入make命令。整个工程完全自动编译,极大提高了效率。

make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能是另外的文件名)在绝大多数的IDE 开发环境中都在使用,已经成为一种工程的编译方法。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

makefile教程博客:https://blog.csdn.net/ruglcc/article/details/7814546

3、静态库与动态库

参考博客:https://blog.csdn.net/u014106566/article/details/84134182

4、cmake、make和makefile
写程序大体步骤为:

1.用编辑器编写源代码,如.c文件。

2.用编译器编译代码生成目标文件,如.o。

3.用链接器连接目标代码生成可执行文件,如.exe。

但如果源文件太多,一个一个编译时就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具,它是一个自动化编译工具,你可以使用一条命令实现完全编译。但是你需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的技能。

对于一个大工程,编写makefile实在是件复杂的事,于是人们又想,为什么不设计一个工具,读入所有源文件之后,自动生成makefile呢,于是就出现了cmake工具,它能够输出各种各样的makefile或者project文件,从而帮助程序员减轻负担。但是随之而来也就是编写cmakelist文件,它是cmake所依据的规则。所以在编程的世界里没有捷径可走,还是要脚踏实地的。

所以流程如下:
cmake使用教程_第1张图片
cmake使用教程_第2张图片
Make:
    要设计一个软件系统,我们首先编写源码,然后通过编译器编译和创建可执行文件。可执行文件就是要实现最终功能的文件。“Make”是一个工具,它控制可执行程序和程序源文件中非源码文件的生成。
    “Make”工具需要清楚的知道如何构建程序。 它通过一个叫做“makefile”的文件知晓如何构建你的程序。这个文件列出了所有的非源码文件以及如何由别的文件来计算它。当你编写了一个程序,你应该为它写一个makefile文件,这样才有可能通过使用“Make”来构建和安装你的程序。 很简单的事情。如果你不理解的话,多读几遍这一段文字,因为理解这一段文字对于接下来的篇幅很重要。
为什么需要“Make”
    需要”make”的一个原因是,它可以使得终端用户构建和安装你的应用包,而不用去详细的了解它具体是如何做到的。每一个工程都有它自己的规则和细微的差别,这会使得每次在复用的时候会变得很痛苦。这就是我们创建这个makefile文件的原因。 构建步骤精确的记录在你提供的这个makefile文件中。“Make” 当源码文件发生变化时自动的指出哪一个文件需要更新。 同时它也自动确定以适当的顺序进行更新文件,当一个非源码文件依赖的另一个非源码文件发生改变时。
    每次当我们改变了系统中的一小部分源码的时候,重新编译整个程序的效率是很低的。因此,当我们改变了一小部分的源码文件的时候重新执行“Make”,它将不会重新编译整个程序。它仅仅更新那些直接或者间接依赖这些改变了的源码文件的非源码文件。很酷吧!“Make” 不局限于具体的语言。对于程序中的每一个非源码文件,makefile文件详细的说明了执行需要的shell命令。这些shell命令能够启动编译器产生目标文件,链接器产生可执行文件,ar更新库,镜像生成器格式化文档,等等。。。Make不仅仅局限于构建一个包。你也可以安装或者卸载一个包,生成索引表或者其他一些你经常做的值得你写下来怎么去做的事情。

CMake是构建系统的生成器,CMake代表跨平台Make。它可以产生Makefile文件,它可以产生Ninja构建文件,它可以产生KDevelop或XCode的项目,它能产生Visual Studio解决方案。从同一个CMakeLists.txt文件来产生项目。如果你正在编写需要在很多不同的平台上构建的软件那么CMake的往往是一个不错的选择。

二、cmake介绍

学习教程:http://www.hahack.com/codes/cmake/
https://www.ibm.com/developerworks/cn/linux/l-cn-cmake/index.html
https://blog.csdn.net/dbzhang800/article/details/6314073
https://www.jianshu.com/p/bbf68f9ddffa

想要在 Windows 平台下生成 OpenCV 的解决方案,需要一个名为 CMake 的开源软件。
CMake 是“crossplatform make”的缩写, 它是一个跨平台的安装(编译)工具,可以
用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的 makefile
或者 project 文件,能测试编译器所支持的 C++特性,类似 UNIX 下的 automake。只
是 CMake 的组态档取名为 CmakeLists.txt。 且 Cmake 并不直接建构出最终的软件,而
是 产 生 标 准 的 建 构 档 ( 如 Unix 的 Makefile 或 Windows Visual C++ 的
projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环
境(IDE)的开发者可以用标准的方式来建构软件,这种可以使用各平台的原生建构系
统的能力是 CMake 与 SCons 等其他类似系统的区别所在。

让大家从新建工程开始,实现一个控制台输出Hello World!的程序。
大家需要做的操作大概是如下几步:
1 新建项目
2 新建c++文件
3 在c++文件内编写程序
4 添加源/头文件进工程
这是完成一个工程建立的最基本步骤。

现在考虑一种更好的情况,当我们通过一些手段已经得到了我们想要的源码.cpp,这个时候我们再建立工程的步骤就更加简单了,只需要进行第一步和第四步即可。That`s the point,CMake的作用就是帮助你在拥有源码的情况下帮助你实现第一步和第四步的。

现在你应该要问“为何如此简单的操作需要使用软件来实现?”,当你们深入学习编程后,你们会意识到这是一个很蠢的问题,不过现在同学们还没有接触过真正的工程代码,所以问出这样的问题也无可厚非。
cmake使用教程_第3张图片
如图所示,是一个深度学习框架的部分工程列表。里面有超过40个互相调用的工程共同组成,一些用于生成库文件,一些用于实现逻辑功能。他们之间的调用关系复杂而严格,如果我想在这样复杂的框架下进行二次开发,显然只拥有它的源码是远远不够的,还需要清楚的明白这几十个项目之间的复杂关系,在没有原作者的帮助下进行这项工作几乎是不可能的。

即使是原作者给出了相关的结构文档,对新手来说建立工程的过程依旧是漫长而艰辛的,因此CMake的作用就凸显出来了。原作者只需要生成一份CMakeLists.txt文档,框架的使用者们只需要在下载源码的同时下载作者提供的CMakeLists.txt,就可以利用CMake,在”原作者的帮助下“进行工程的搭建。
cmake使用教程_第4张图片

三、cmake的安装和使用

1、首先在官网上进行下载
在这里插入图片描述
cmake使用教程_第5张图片
双击进行安装即可!
2、使用
可以在CMake的安装路径下的bin文件夹中找到CMake – gui,如图所示。
cmake使用教程_第6张图片
打开后就可以进入gui。
cmake使用教程_第7张图片
Gui界面如图所示,在Where is the source code后面的小白框中添加你所下载的源码路径,并且确保你将CMakeLists.txt放置其中。Where to build the binaries后的小白框是你希望将编译好的工程存放在哪个路径当中。当你完成上述工作后,点击配置按钮,用于配置你编译器类型。你可以选择32位或者64位VS或者MinGW等等,看你的需要决定。配置的英文是Configure。
cmake使用教程_第8张图片
之后点击Finish,完成配置,如果你的配置参数(在配置和生成按钮上有个表框,里面可以修改生成工程的相关参数,如使用什么样的运算库,是否给其他语言留出接口等等,参考你所构建工程的原作者写给你的文档进行修改)没有出错的话,再点击Generate生成对应的工程文件。如果你选择VS作为IDE那么你应该会在Where to build the binaries这个目录下找到生成的.sln文件,打开工程,设置ALL_BUILD为活动项目,编译即可。
3、使用例子
cmake使用教程_第9张图片
cmake使用教程_第10张图片
cmake使用教程_第11张图片
cmake使用教程_第12张图片
cmake使用教程_第13张图片

你可能感兴趣的:(Windows下学习)