码迷,mamicode.com
首页 > 其他好文 > 详细

A quick introduction to CMake

时间:2019-01-07 21:23:43      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:svc   体系   了解   目录   执行   www   编译   windows   运行   

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!\n");
    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

标签:svc   体系   了解   目录   执行   www   编译   windows   运行   

原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/10234502.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!