A quick introduction to CMake
Posted kelamoyujuzhen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A quick introduction to CMake相关的知识,希望对你有一定的参考价值。
CMake特点
- 开放源代码,使用类BSD许可发布。http://cmake.org/html/Copyright.html
- 跨平台,并可生成native编译配置文件,在Linux/Unix平台,生成makefile,在苹果平台,可以生成xcode,在Windows平台,可以生成MSVC的工程文件。
- 能够管理大型项目,KDE4就是最好的证明。
- 简化编译构建过程和编译过程。Cmake的工具链非常简单:cmake+make。
- 高效虑,按照KDE官方说法,CMake构建KDE4的kdelibs要比使用autotools来构建KDE3.5.6的kdelibs快40%,主要是因为 Cmake在工具链中没有libtool。
- 可扩展,可以为cmake编写特定功能的模块,扩充cmake功能。
我们需要学习CMake吗?
- 如果你没有实际的项目需求,那么看到这里就可以停下来了,因为cmake的学习过程就是实践过程,没有实践,读的再多几天后也会忘记。
- 如果你的工程只有几个文件,直接编写Makefile是最好的选择。
- 如果使用的是C/C++/Java之外的语言,请不要使用cmake(至少目前是这样)
- 如果你使用的语言有非常完备的构建体系,比如java的ant,也不需要学习cmake,虽然有成功的例子,比如QT4.3的csharp绑定qyoto。
- 如果项目已经采用了非常完备的工程管理工具,并且不存在维护问题,没有必要迁移到cmake
- 如果仅仅使用qt编程,没有必要使用cmake,因为qmake管理Qt工程的专业性和自动化程度比cmake要高很多。
传统上Linux平台下C/C++项目还是靠makefile来组织代码,但是越来越多开源软件使用CMake来组织代码,Linux平台下CMake也能生成makefile,用户安装软件的时候与传统上基于makefile安装软件过程是一样的,这一点对用户及其友好。再加上makefile那蛋疼的语法,相比之下CMake就要好太多。
初探cmake
代码结构
# tree /root/cmake_learn /root/cmake_learn ├── CMakeLists.txt └── main.c ####main.c#### #include <stdio.h> int main(){ printf("Hello World! "); return 0; } ####main.c#### PROJECT(HELLO) SET(SRC_LIST main.c) MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR}) MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR}) ADD_EXECUTABLE(hello ${SRC_LIST})
代码构建
在项目目录(/root/cmake_learn)下
cmake .
会生成多生成出CMakeFiles目录,CMakeCache.txt cmake_install.cmake Makefile文件。这种做法是内部构建(in-source build)
# ls CMakeCache.txt CMakeFiles cmake_install.cmake CMakeLists.txt main.c Makefile
接着使用make构建(由于我这个项目简单,就没有make install的过程)。单纯make构建(build)过程信息输出较少,可以make VERBOSE=1 输出更加详细过程信息。但是这个输出又有很多信息我们实际不需要,还可以设置CMAKE_VERBOSE_MAKEFILE 。参考 这个
# make Scanning dependencies of target hello [ 50%] Building C object CMakeFiles/hello.dir/main.c.o [100%] Linking C executable hello [100%] Built target hello
外部构建(out-of-source build)
上面已经展示过了内部构件,发现生成的中间文件比我们自己写的文件还要多。更甚至这些中间文件还无法自动删除(即你运行make clean删不掉中间文件)。网上解释说cmake不支持make distclean,关于make clean 和 make distclean网上解释很多。这个其实不关键,无论是clean、distclean也好,还是其他的什么东西。在makefile中都是一个标记,这些标记没有依赖,通常做一些中间文件清理、安装软件的工作。但是有的时候如果某个二货不小心建了一个和标记一样的文件,就可能导致标记对应的指令无法执行,参考 这个
为了解决这个问题,cmake还支持外部构建(out-of-source build)
任意位置建一个build目录,当然也可以是项目目录。cmake_learn有我们创建的CMakeLists.txt
# pwd /root/build # cmake /root/cmake_learn
执行后,中间文件会生成在我们指定的build目录
# pwd /root/build # ls CMakeCache.txt CMakeFiles cmake_install.cmake Makefile # make # ./hello Hello World!
稍微复杂点的代码
43
以上是关于A quick introduction to CMake的主要内容,如果未能解决你的问题,请参考以下文章
A brief introduction to complex analysis
[An Introduction to GCC 学习笔记] 08 链接外部外部动态库C标准
Brief introduction to Java String Split 简单介绍下Java String Split