1. cmake介绍
1.1 cmake用途
CMake的用途是能通过一系列的源码和相关的配置来生成需要的编译器平台上的项目文件。譬如,如果一个项目需要在Windows上用VS编译,在Linux上用make编译,在OS X上用XCODE,那么按以前的做法是在整个项目文件里看三个目录,分别放置VS的sln文件,Linux的makefile,OS X的XCODE,然后让不同需求的人到相应的目录用自己需要的工程文件(这看起来没有什么不好似乎)。有了CMake以后,就不需要这三个目录了,只要有一个给CMake读的文件,然后CMake的UI上会需要用户选择目标平台,这样CMake就会生成目标平台上的工程文件。举例,如果用户选的是VS2005平台,那么CMake就会在源代码目录下生成供VS2005使用的sln文件;如果是make,就会生成makefile等等。
1.2 cmakelist 和 makefile
- gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。
- 当你的程序只有一个源文件时,直接就可以用gcc命令编译它。
- 但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大
- 所以出现了make工具, make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。
- makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。
- makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。
- makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。
- 这时候就出现了Cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。
- 可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。
- 到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。
- 然如果你用IDE,类似VS这些一般它都能帮你弄好了,你只需要按一下那个三角形
Cmake是用来makefile的一个工具:读入所有源文件之后,自动生成makefile。

2.1 为什么要编译?
为了在调试时可以跟踪进入到源码中,我们需要重新编译生成.dll和.lib文件,这样替换掉opencv提供的.dll和.lib文件,就可以解决这个问题。
本来opencv提供的动态链接库就已经是可以用的,但是在调试过程中,有时候想要查看源码,而那些却被封装好了,F11根本进不去,这样就不得不翻根目录下的.cpp文件来看了,但这样做比较麻烦,心里总是不爽,自然而然就要想点偏方了。
多数情况下,能够直接使用OpenCV自带的库文件,可是假设是为了方便调试:方便调试opencv源代码或者为了与某些库兼容,还是须要又一次编译opencv的源代码。
2.2 重编译得到了什么?
新产生的动态链接库(.dll和.lib)。
1)下载并安装CMake;
2)用CMake工具生成OPENCV工程项目; (VS下为.sln文件)
3)用VS2010代开工程项目,重新编译得到动态链接库(.dll和.lib文件);
4)应用上述文件新建工程,并F11跟踪调试代码。