首先去官网下载源码包
然后输入以下命令
$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 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;
}
编译
- 把命令行的工作目录切换到在当前有CMakeLists.txt的这个目录下,
- 然后输入
cmake ./
,注意后面那是两个符号“点+斜杠”表示编译当前目录。你会发现你当前目录下多了很多文件。 - 然后输入
make
产生目标可执行文件。然后你会发现当前文件夹下面多了一个可执行文件hello
。你可以试试./hello
运行这个可执行文件。
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