【整理】CMake 介绍和 CMake 实践
【如何安装 CMake】:
1. CMake 的安装可以使用 autotools 进行安装,点击cmake-2.8.6.tar.gz链接,可以对软件进行下
2. 执行 ./configure; make; make install
【CMake的原理】
准备main.cpp文件
a.创建 CMakeLists.txt(注意:此文件名大小写必须如此命名),向该文件中加入以下几行(内容中命令的大小写无所谓):
执行完该命令后执行ls可以看到:
生成了CMakeFiles(目录)、CMakeCache.txt、cmake_install.cmake以及Makefile文件。
c.执行make。
这时当前目录下就会生成可执行文件:
【例子解释】:
上面CMakeLists.txt的内容重新列出如下:
PROJECT指令的语法:
PROJECT(projectname [CXX] [C] [JAVA])
该指令用来定义工程名称和工程支持的语言。这个指令也同时隐式定义了两个cmake变量: projectname _BINARY_DIR以及 projectname _SOURCE_DIR。
在该例子中就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR,两个变量指的都是当前工程的路径。
SET指令的语法:
SET(VAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]])
Set指令是用来显式的定义变量的,我们之前用到的是SET(SRC_LIST main.cpp),如果有多个源文件,也可以定义成SET(SRC_LIST main.cpp t1.cpp t2.cpp)。
MESSAGE指令的语法是:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
这个指令用于向终端输出用户信息,包含三种类型:
上例使用的是STATUS类型进行信息输出,用于显示由PROJECT指令隐式定义的两个变量HELLO_BINARY_DIR和HELLO_SOURCE_DIR的值。
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了这个,工程会生成一个文件名为hello的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表,本例中你可以直接写成ADD_EXECUTABLE(hello main.c)。
本例CMakeLists.txt的最简化形式:
=== 我是分割线 ===
下面我们介绍一个比较实用的例子,既包含生成静态库又包含引入外部头文件和链接库的cmake demo。
先按照工程规范建立工程目录并编写代码,以下面的工程目录为例进行解释这个例子,工程的目录结构为:
编译工程要实现的目标:
1. 编写CMakeLists.txt
由于一个工程目录中包含多个项目,其中在此项目中包含util项目和main项目,其中util项目是用以生成main程序需要的静态库,main是用以生成可执行文件。
在整个工程项目的根目录下的CMakeLists.txt是用来定义工程需要的CMake设置以及子目录src,用以递归调用src中的MakeLists.txt。该CMakeLists.txt的内容定义如下:
目录src中的CMakeLists.txt用以定义src目录下包含的两个工程(main和util)的依赖关系。
目录util里面的CMakeLists.txt是用以定义生成util静态库的规则,其中内容如下:
SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib) -- 定义了库生成的路径,内部变量LIBRARY_OUTPUT_PATH用于存放库的生成路径。
SET(CMAKE_C_COMPILER g++) -- 定义C的编译器为g++,防止出现C和C++代码在不指定C编译器的情况下默认使用gcc,导致系统编译混乱。
SET(SRC_LIST hello.c) -- 定义库文件需要的源文件。
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include) -- 定义非标准库头文件要搜索的路径。
其中INCLUDE_DIRECTORIES命令的格式为:
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
ADD_LIBRARY(util STATIC ${SRC_LIST}) -- 定义生成库的名字、类型和库所需要的源文件,
其中ADD_LIBRARY命令格式为:
ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
目录main里面的CMakeLists.txt是用来定义可执行程序编译和链接时所需要的一些命令或环境。内容如下:
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include) -- 定义工程引用的include文件夹位置,其中存放使用到的库的头文件。
LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib) -- 定义工程引用的库文件位置,其中存放着库文件。
ADD_EXECUTABLE(hello ${SRC_LIST}) -- 定义生成的可执行文件。
TARGET_LINK_LIBRARIES(hello util) -- 用以定义链接时需要的库文件。
2.在工程目录下创建build目录,并采用out-of-source方式编译项目。执行命令
执行make命令,结果如下:
可以看到工程创建和编译成功了。
3. 安装
在工程目录下添加COPYRIGHT、README和run.sh,重新编辑工程目录下的CMakeLists.txt。在CMakeLists.txt中添加如下命令:
这些命令表示在执行make install命令时,安装程序会拷贝相应的文件、目录或程序到指定的前缀开始的目录中,cmake执行命令如下:
这时将工程目录安装到~/data/cmake_demo目录下。执行结果如下:
其中cmake编译c、c++工程完毕。