CMake基础教程(上)
何为cmake
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的代码编译过程,输出各种各样的makefile或者project文件。CMake 的组态档取名为CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生makefile,然后再依一般的建构方式使用
编写一个简单的cmake
创建一个名为 CMakeLists.txt 的文件(注意 ,千万不要拼写错误),然后就可以开始编写第一个cmake了,代码如下:
# CMake的最低版本号需求
cmake_minimum_required (VERSION 2.8)
# 工程名称设置为TEST(注意并不是生成的可执行文件名)
PROJECT(TEST)
# 定义变量SRC_LIST表示源文件a.cpp
SET(SRC_LIST a.cpp)
# 生成可执行文件Test
ADD_EXECUTABLE(Test ${SRC_LIST})
PROJECT(projectname [CXX] [C] [Java])
⽤于指定⼯程名称,并可指定⼯程⽀持的语⾔(⽀持的语⾔列表可以忽略,默认⽀持所有语
⾔ ) 。
SET
用于显示定义变量,比如SET(SRC_LIST main.c)。有多个源文件,也可以定义为SET(SRC_LIST main.c a.c b.c)
ADD_EXECUTABLE([BINARY] [SOURCE_LIST])
定 义 了 这 个 ⼯ 程 会 ⽣ 成 ⼀ 个 ⽂ 件 名 为 [BINARY] 可 执 ⾏ ⽂ 件 , 相 关 的 源 ⽂ 件 是
SOURCE_LIST 中定义的源⽂件列
使用该cmake构建项目
因为构建的时候会产生大量的中间文件,一般我们会先创建一个build文件夹,在build文件夹中使用cmake命令。当前目录结构如下:
a.cpp CMakeLists.txt build/
|
|
V
(空目录)用于执行cmake
进入build目录中,执行命令
cmake ..
执行过会可以发现,build出现了大量的中间文件,并且生成了MakeFile,在build目录中使用命令
make
即可在该目录下生成一个可执行文件Test。至此,我们成功使用了cmake构建我们第一个项目。
优化目录结构
在实际的项目开发中,我们为了让项目的结构清晰,一般会有固定的模式来组织目录,下面给出一个典型的结构.
build/ CMakeLists.txt src/ bin/
| | |
| | V
V | 存放生成的可执行文件
(用于执行cmake的目录) V
CMakeLists.txt a.cpp(存放源文件和子CMakeLists.txt)
我们希望在顶层的 CmakeList.txt 中接着调用src/下的 CMakeLists.txt 继续去构建项目,并且将最终生成的可执行文件安装到bin/下。来看两个CMakeLists.txt的编写
# 顶层的CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
PROJECT(TEST2)
# 添加子目录,会在该子目录中寻找CMakeLists.txt继续执行
ADD_SUBDIRECTORY(src)
# CMake的最低版本号需求
cmake_minimum_required (VERSION 2.8)
# 手动加入文件
SET(SRC_LIST a.cpp)
# 生成可执行文件Test
ADD_EXECUTABLE(Test ${SRC_LIST})
# 将可执行文件安装到顶层同级的bin目录下
INSTALL(TARGETS Test DESTINATION ${PROJECT_SOURCE_DIR}/bin)
ADD_SUBDIRECTORY
用于指定一个子目录,子目录下应该包含CMakeLists.txt文件和代码文件。子目录可以是相对路径也可以是绝对路径,如果是相对路径,则是相对当前目录的一个相对路径。
INSTALL
用于将生成的二进制文件,动态库,静态库等安装至指定的目录。cmake后,使用 make install 进行安装。
PROJECT_SOURCE_DIR
这是cmake预定义的变量,用于表示顶层CMakeList对应的目录
构建项目
进入build目录执行以下语句
cmake ..
make
make install
执行完毕,可以看到bin/目录下安装了Test可执行文件。