CMake-1

CMake介绍

CMake简介

​ cmake是一个高级编译配置工具。

​ 当多个人用不同语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等),这时候就需要CMake。所有操作都是通过编译CMakeLists.txt来完成的。

最新版本的CMake应当去官网学习CMake Tutorial

HelloWorld

  1. 编写HelloWorld程序

    1
    2
    3
    4
    5
    6
    7
    #main.cpp

    #include <iostream>

    int main() {
    std::cout << "Hello World!" << std::endl;
    }
  1. 配置CMakeLists.txt

    1
    2
    3
    4
    5
    6
    7
    #CMakeLists.txt

    PROJECT (HELLO)
    SET(SRC_LIST main.cpp)
    MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
    MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
    ADD_EXECUTABLE(hello ${SRC_LIST})
  2. 使用cmake,生成makefile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ❯ cmake ./
    -- The C compiler identification is GNU 4.8.5
    -- The CXX compiler identification is GNU 4.8.5
    -- 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
    -- 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
    -- This is BINARY dir/root/codes/cpp
    -- This is SOURCE dir/root/codes/cpp
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /root/codes/cpp
  3. 使用make命令编译makefile

    1
    2
    3
    4
    5
    ❯ make
    Scanning dependencies of target hello
    [100%] Building CXX object CMakeFiles/hello.dir/hello.cpp.o
    Linking CXX executable hello
    [100%] Built target hello

CMake语法

关键字

PROJECT

可以用来指定工程的名字和支持的语言,默认支持所有语言

1
2
3
4
5
PROJECT(HELLO)	# 指定了工程名字,并且支持所有语言

PROJECT(HELLO CXX) # 指定了工程名字,并且支持语言是cpp

PROJECT(HELLO C CXX) # 指定了工程名字,并且支持语言是C和C++

该指令隐式的定义了两个CMake变量

  • _BINARY_DIR: 本例中是HELLO_BINARY_DIR
  • _SOURCE_DIR: 本例中是HELLO_SOURCE_DIR

MESSAGE关键字就可以直接使⽤者两个变量,当前都指向当前的⼯作⽬录

SET

用来显式地指定变量

1
2
3
SET(SRC_LIST main.cpp)    # SRC_LIST就包含了main.cpp

SET(SRC_LIST main.cpp t1.cpp t2.cpp) # 指定多个

MESSAGE

像终端输出用户信息

主要包含三种信息

  • SEND_ERROR,产生错误,生成过程被跳过
  • SATUS,输出前缀为"-"的消息
  • FATAL_ERROR,立即终止所有cmake进程

ADD_EXECUTABLE

生成可执行文件

1
ADD_EXECUTABLE(hello ${SRC_LIST})  # 可执行文件名hello,源文件读取变量SRC_LIST中的内容

语法的基本规则

  • 变量使用 '${}'取值,但在IF控制语句中直接使用变量名
  • 指令(参数1 参数2 ......)
  • 指令大小写无关,腿甲全部使用大写指令

内部构建和外部构建

  • 内部构件会在源文件目录下生成较多的临时文件
  • 外部构建,就会把生成的临时文件放在build目录下,不会对源文件有任何影响

外部构建示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
❯ cd build

[root@Aurora] ~/codes/cpp/build
❯ cmake ../
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- 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
-- 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
-- This is BINARY dir/root/codes/cpp/build
-- This is SOURCE dir/root/codes/cpp
-- Configuring done
-- Generating done
-- Build files have been written to: /root/codes/cpp/build

[root@Aurora] ~/codes/cpp/build
❯ make
Scanning dependencies of target hello
[100%] Building CXX object CMakeFiles/hello.dir/hello.cpp.o
Linking CXX executable hello
[100%] Built target hello

工程化

  • src:工程源代码
  • doc:工程的文档
  • 添加COPYRIGHT,README
  • 添加runhello.sh脚本
  • 将构建后的目标文件放入目录的bin子目录
  • 将doc目录的内容以及COPYRIGHT/README安装到/usr/share/doc/cmake
1
2
3
4
5
6
7
❯ tree -L 2
.
├── build
├── CMakeLists.txt
└── src
├── CMakeLists.txt
└── hello.cpp

外层CMakeLists.txt

1
2
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)

src目录下CMakeLists.txt

1
ADD_EXECUTABLE(hello main.cpp)

ADD_SUBDIRECTORY

1
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
  • 用于指向当前工程添加存放源文件的子目录,并可以指定之间二进制文件和目标二进制文件存放位置

  • [EXCLUDE_FROM_ALL],排除目录下文件不进行编译

  • ADD_SUBDIRECTORY(src bin)

    将 src ⼦⽬录加⼊⼯程并指定编译输出(包含编译中间结果)路径为bin ⽬录 如果不进⾏ bin ⽬录的指定,那么编译结果(包括中间结果)都将存放在build/src ⽬录

更改二进制的保存路径

SET指令重新定义EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH变量,来指定最终的目标二进制文件的位置


CMake-1
https://www.spacezxy.top/2022/02/27/CMake/CMake-1/
作者
Xavier ZXY
发布于
2022年2月27日
许可协议