CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。CMake不构建出最终的可执行文件,而是产生一个标准的建构档(即根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件),然后再依一般的建构方式使用,从而实现软件的跨平台。
<1>Linux下CMake的安装:
先到官网下载CMake源码包:https://cmake.org/download/
打开终端依次执行以下命令:
tar -xzvf cmake-2.6.4.tar.gz cd cmake-2.6.4 ./bootstrap make make install
cmake 会默认安装在 /usr/local/bin 下面。(windows下安装可以直接下载安装包进行安装)
<2>Linux下使用CMake生成makefile & 编译的大致流程如下:
1.编写CMake的配置文件CMakeLists.txt(组态档的命名和类型必须为这个);
2.然后在终端输入CMake <PATH>(PATH是 CMakeLists.txt 所在的目录)或者CMake .(如果是在当前目录下,注意CMake和.之间有空格)来生成Makefile;
3.最后在终端输入make命令进行编译(windows平台下会生成VS的工程文件,可以使用VS工具进行编译)输出可执行文件。
以上就是CMake简单使用步骤,下面本文将会通过一些简单的例子来讲解CMake的一个基本使用。
<3>实例解析
主题一:单个源文件
假设现在我们有个源文件demo1.c,该程序实现对某个数求绝对值
#include <stdio.h> #include <stdlib.h> int abs(int num){ return num>=0?num:-num; } void main(int argc, char* argv[]){ int num = 0; if(argc < 2){ printf("usage: %s number\n", argv[0]); } else{ num = atoi(argv[1]); printf("abs(%d) = %d\n", num, abs(num)); } }
接着在demo1.c源文件的目录下,编写CMakeLists.txt
#CMake中#后面的语句解释为注释行
#指定cmake最低使用版本号,可以不设置,但是会有一个warnning cmake_minimum_required(VERSION 2.8) #设置项目工程的名称 project(Demo1) #将demo1.c源文件编译成一个名为Demo1的可执行文件 add_executable(Demo1 demo1.c)
然后在当前的目录下,输入cmake .命令生成makefile,最后再输入make命令(windows下使用VS打开.sln工程文件进行编译)来编译得到最后的可执行文件Demo1
[Tino@Tino-linux demo_test]$ cmake . -- The C compiler identification is GNU 4.4.7 -- The CXX compiler identification is GNU 4.4.7 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /home/Tino/Documents/demo_test [Tino@Tino-linux demo_test]$ make Scanning dependencies of target Demo1 [ 50%] Building C object CMakeFiles/Demo1.dir/demo1.c.o [100%] Linking C executable Demo1 [100%] Built target Demo1 [Tino@Tino-linux demo_test]$ ./Demo1 -5 abs(-5) = 5 [Tino@Tino-linux demo_test]$
主题二:多个源文件
(1)同一目录
假设现在我们把上面例子中的求绝对值abs单独编写一个另外一个源文件MyFunction.c中,如下形式(所有源文件都在同一目录demo_test下)
/demo_test
demo2.c
MyFunction.h
MyFunction.c
此时的CMakeLists.txt应修改如下
cmake_minimum_required(VERSION 2.8) project(Demo2) add_executable(Demo2 demo2.c MyFunction.c)
相对于上例的CMakeLists.txt,只是在add_executable中多添加了一个源文件。这样写过固然没有问题,但是考虑到多文件的情况,我们这样手动的添加多个源文件是不是太麻烦了呢?是的,这个时候我们可以这样来添加文件
cmake_minimum_required(VERSION 2.8) project(Demo2) #该指令会查找所指定目录下(. 代表当前目录)的所有源文件 #并把文件名赋值给变量DIR_SOURCE aux_source_directory(. DIR_SOURCE) add_executable(Demo2 ${DIR_SOURCE})
这样就可以顺利编译出可执行文件了。
(2)不同目录
现在在demo_test目录下新建一个子目录math,将我们的MyFunction.h和MyFunction.c文件移动math文件里面。这种情况下,我们就必须要为每个源文件目录编写一个CMakeLists.txt。文件结构如下
/demo_test demo03 /math MyFunction.h MyFunction.c
首先在子目录math里面,编写CMakeLists.txt
aux_source_directory(. DIR_LIB_SOURCE)
#将目录中的源文件编译为静态链接库
add_library(MyFunction ${DIR_LIB_SOURCE})
在根目录demo_test中的CMakeLists.txt
cmake_minimum_required(VERSION 2.8) project(Demo3) aux_source_directory(. DIR_SOURCE) #添加一个子目录math,这样子目录下的CMakeLists.txt也会被处理 add_subdirectory(math) add_executable(Demo3 ${DIR_SOURCE}) #为可执行文件添加我们所需要的链接库MyFunction target_link_libraries(Demo3 MyFunction)
接着我们再输入cmake命令:
[Tino@Tino-linux demo_test]$ cmake . -- The C compiler identification is GNU 4.4.7 -- The CXX compiler identification is GNU 4.4.7 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /home/Tino/Documents/demo_test
这样根目录和子目录都会生成makefile,再make编译成可执行文件就可以了
[Tino@Tino-linux demo_test]$ make Scanning dependencies of target MyFunction [ 25%] Building C object math/CMakeFiles/MyFunction.dir/MyFunction.c.o [