写在前面
CMake这玩意儿自从学会去fork别人的代码的时候就一直不停的出现在我的眼前,当然,去配置C++的各种库的时候也很常见。具体是干啥的,实际上一直都是一知半解的,所以花点时间,搞搞它具体是怎么个写法。
我目前所接触到的CMake可以完成的事情:
- 根据C++库的源码,生成配置C++库的一些配置文件,即.lib以及.dll格式的一些文件。在我的理解,对于不同操作系统以及不同的操作设备而言,由高级语言(C,C++,python等)生成的二进制的执行语言(机器可读的语言)是不同的。CMake可以根据具体的情况去生成,使得我们可以免于担心这些问题。
- 使用CMake构建二进制的项目文件,并且使用这些文件进一步的生成可执行的程序(.exe格式的文件)。
使用CMake配置C++库
关于使用CMake来完成C++库的配置,可以找到很多具体的库的配置的教程,例如计算机图形处理常用库openCV的配置,在这些配置教程当中十分详细的介绍了如何使用CMake去做这样的事情,所以这里就不再赘述了。
使用CMake生成可执行程序
这一部分实际上应当是CMake的精彩之处了。为了对这个过程进行说明,以生成最简单的hellow_world的程序为例,对这个过程进行说明。我比较熟悉visual studio的IDE,所以我的示例就由此给出(虽然实际上和IDE的关系不大)。
写一个hellow_world.cpp
IDE就是来做这件事情的,使用visual studio创建一个控制台应用程序(我最爱用的),写一个hellow_world.cpp(实际上最新版本的vs打开后就是这个程序),贴一下代码好了。
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
}
然后关掉VS,后面的事情基本上和他没有关系了。
写一个CMakeList.txt
对于所有的使用CMake来生成可执行程序的文档中,都只使用同样的CMakeList.txt,windows系统下直接创建一个文本文档即可,命名一定得是CMakeList.txt,.txt是格式后缀。在本个实例中的CMakeList.txt如下:
PROJECT (HELLO)
SET(SRC_LIST hellow_world.cpp)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
CMakeList.txt中使用的他预言不属于任何的一种高级语言,而是CMake的团队自己开发的一种新的语言,所以需要额外的学习。
调用命令行
以windows系统下的操作为例,使用快捷键(Win+R),输入cmd,然后enter即可。
命令行就是长这个样子的,然后转到hellow_world.cpp所在的文件路径下,前面所写的CMakeLists.txt也要放在同一个文件路径下,在命令行输入"cd+文件的路径"。
可以自己建一个build的文件夹(为了和源文件分离开),也可以使用命令行建一个文件夹,命令行输入“mkdir build”,意思是在当前路径下创建文件夹build.
转到build目录下“cd build”
使用cmake进行配置与生成,键入“cmake ..”,意思是在上一级的目录中找到CMakeList.txt。“cmake .”是在本级目录中寻找,并且据此进行配置与生成。这个过程实际上是要生成Makefile,window执行这一步时可能会失败。
解决方法:在build文件夹下找到CMakeCache.txt,删去
调用“cmake .. -G “Unix Makefiles”“即可
最后执行make的步骤即可生成可执行的程序,windows系统在命令行键入“mingw32-make”
执行时在命令行键入"hello"。这个名字是在CMakeList.txt中定义的,自然也是可以修改的。
好的,搞定!
写在后面
mingw32-make的命令需要通过一定的配置才可以使用,具体的配置方法可以参见这篇文章。
通过以上的介绍,可以发现实际上cmake的核心在于CMakeList.txt的编写,更多的内容希望通过对于官方文档的教程翻译进行解读!