首先去官网下载源码包

https://cmake.org/download/

然后输入以下命令

$tar -zxvf xx.tar.gz
$./bootstrap
$make
$make install

在其中可能会遇到一些问题,比如

Error when bootstrapping CMake:
Cannot find appropriate C compiler on this system.
Please specify one using environment variable CC.
See cmake_bootstrap.log for compilers attempted.

Log of errors: /usr/local/src/cmake-2.8.4/Bootstrap.cmk/cmake_bootstrap.log

这是缺少gcc,去安装gcc

sudo apt update
sudo apt install build-essential

如果再预先./bootstrap提示

sudo gem install cocoapods 失败_cmake

就执行命令

sudo apt-get install libssl-dev

再次运行就成功了

CMake简单使用

首先自己新建一个比如bulid目录,以防搞混,然后在创建目录下创建两个文件,

├── CMakeLists.txt
└── main.c

内容如下:

CMakeLists.txt

PROJECT(HELLO)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(hello ${DIR_SRCS})

PROJECT()它是指定当前这个项目的名字,你可以随便写的没关系的。AUX_SOURCE_DIRECTORY()中的第一个参数是指定源文件所在文件夹(在本例子中是当前目录,就是一个点),第二个参数是把源文件夹所有源文件名存到DIR_SRCS这个变量中。ADD_EXECUTABLE()它指定的是把哪些源文件编译成目标文件。以及目标文件名叫啥。这这个例子中的目标文件名叫做hello你可以随便写的没关系的。但是后面那个源文件地址${DIR_SRCS}这个不能随便写,它的意思是读取DIR_SRCS这个变量的值(在本例子中这个变量值是源文件名)。

main.c

#include<stdio.h>
int main()
{
    printf("hello world! my first cmake");
    return 0;
}

编译

  1. 把命令行的工作目录切换到在当前有CMakeLists.txt的这个目录下,
  2. 然后输入cmake ./,注意后面那是两个符号“点+斜杠”表示编译当前目录。你会发现你当前目录下多了很多文件。
  3. 然后输入make产生目标可执行文件。然后你会发现当前文件夹下面多了一个可执行文件hello。你可以试试./hello运行这个可执行文件。

sudo gem install cocoapods 失败_cmake_02

sudo gem install cocoapods 失败_bootstrap_03

cmake工程化

把源代码放在src这个文件夹内,bin目录暂时为空到时候把编译后的文件全放到bin文件夹中。记得在当前目录和src目录下面两个目录都要创建CMakeLists.txt

├── bin
├── CMakeLists.txt
└── src
    └── main.c
    ├── CMakeLists.txt

当然当前目录下的CMakeLists.txt内容也需要变化(src目录下的CMakeLists.txt内容为空):

PROJECT(HELLO)
ADD_SUBDIRECTORY(src)
AUX_SOURCE_DIRECTORY(./src DIR_SRCS)
ADD_EXECUTABLE(hello ${DIR_SRCS}

你会发现多了一行ADD_SUBDIRECTORY(src ),其中ADD_SUBDIRECTORY()的参数是源代码存放的文件夹。
然后我们执行编译命令:cmake .,然后你会发现bin这个文件夹里面多了很多内容。接下来我们只需要进入到bin这个文件夹执行make命令来生成可执行文件。

cmake使用头文件等外部依赖

├── bin
├── CMakeLists.txt
└── src
    └── main.c
    ├── a.h
    ├── CMakeLists.txt

然后src/CMakeLists.txt这个文件此时需要增加内容了:

AUX_SOURCE_DIRECTORY(. LIB_FILES)       # 这个表示获取当前src目录下所有文件名并存入LIB_FILES这个变量中
ADD_LIBRARY(LIBS ${LIB_FILES})                   # 这个表示将${LIB_FILES}这些文件加入库中,然后并且复制一份到LIBS这个变量中

项目根目录下的CMakeLists.txt的文件内容也需要改动:

PROJECT(HELLO)
AUX_SOURCE_DIRECTORY(./src DIR_SRCS)
ADD_EXECUTABLE(hello ${DIR_SRCS})   
TARGET_LINK_LIBRARIES(hello ${LIBS}) # 向可执行文件hello提供链接库LIBS是前面提到的变量

cmake编译生成中间代码,以及make编译生成目标可执行文件和前面的操作一样。都是回到项目根目录下:
输入:

$ cmake .
$ make