2. CMake 的简单使用

2. CMake 的简单使用

我们创建一个工程目录,在里面定义一些简单的加减乘除运算,然后定义一个 main.cpp 的文件:

结构如下:

tree /f .\
D:\SOURCE\CMAKE_PROJ
└─proj1
        add.cpp
        CMakeLists.txt
        div.cpp
        head.h
        main.cpp
        mul.cpp
        sub.cpp

其中 header.h 里面放了相关数学运算的定义,这里的代码都不难,主要做演示使用。

如下是 main.cpp 的内容:

#include <iostream>
#include "head.h"	// 注释掉这行,就要取消 extern 部分的注释

// extern 提示到别的模块去找函数的具体实现
// extern double mul(const double x1, const double x2);
// extern double add(const double x1, const double x2);
// extern double sub(const double x1, const double x2);
// extern double div(const double x1, const double x2);

int main(int argc, char **argv) {
  double x1 = 3.14, x2 = 6.18;

  double add_res = add(x1, x2);
  double mul_res = mul(x1, x2);
  double sub_res = sub(x1, x2);
  double div_res = div(x1, x2);

  std::cout << add_res << " " << mul_res << " " << sub_res << " " << div_res
            << '\n';
  return 0;
}

如果要构建一个可执行文件,我们最开始学的就是使用 g++ 或者 clang++ 直接编译:

g++ -Wall -g main.cpp add.cpp mul.cpp -o main.exe

运行:

.\main.exe
9.32 19.4052 -3.04 0.508091

添加 CMakeLists.txt:在当前工程目录下添加一个文件,CMakeLists.txt

2.1 只有源文件

2.1.1 注释

使用 # 进行行注释,使用 #[[]] 进行块注释

# 这是一个行注释

#[[
这是
一个
块注释]]
cmake_minimum_required(VERSION 3.17)
project(CALC)
add_executable(app add.c div.c main.c mult.c sub.c)

2.1.2 最低版本要求

cmake_minimum_required(VERSION 3.xx): 指定了本地的 CMake 的最低版本(非必须,但建议添加)

cmake_minimum_required(VERSION 3.17)

2.1.3 指定工程信息

project:定义工程名称,并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。

project(<PROJECT_NAME> [<language-name>...])
project(<PROJECT-NAME>
       [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
       [DESCRIPTION <project-description-string>]
       [HOMEPAGE_URL <url-string>]
       [LANGUAGES <language-name>...])

这里的 [<language-name>] 就是支持构建的语言类型,如 C,C++ 等。

2.1.4 生成可执行程序

add_executable:被定义的工程会生成一个可执行程序

add_executable(可执行程序名 源文件名)
# 可执行程序名:不需要添加后缀,和 project 中的名称没有关系
# 源文件名:所有需要的源文件,可以是一个,也可以是多个

例如本程序中的:

cmake_minimum_required(VERSION 7.17)
project(CALC)
add_executable(calc main.cpp div.cpp sub,cpp mul.cpp add.cpp)

也可以写成如下样式:

add_executable(calc main.cpp;div.cpp;sub,cpp;mul.cpp;add.cpp)

然后我们就可以生成可执行程序了,在这里我们创建一个文件夹:build ,将生成的文件全部放入 build 中,就不会让目录看起来乱糟糟的:

mkdir build
cd build
cmake ..	# 对 CMakeList.txt 所在的目录进行访问执行

在 Windows 系统生成的文件上是这样的:

cmake ..
-- Building for: Visual Studio 17 2022
-- Selecting Windows SDK version 10.0.22621.0 to target Windows 10.0.22631.
-- The C compiler identification is MSVC 19.38.33130.0
-- The CXX compiler identification is MSVC 19.38.33130.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/Program Files/Visual Studio/Community/2022/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/Program Files/Visual Studio/Community/2022/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (3.2s)
-- Generating done (0.0s)
-- Build files have been written to: D:/Source/cmake_proj/proj1/build

\tree /f .\build 
D:\SOURCE\CMAKE_PROJ\PROJ1\BUILD
│  ALL_BUILD.vcxproj
│  ALL_BUILD.vcxproj.filters
│  CALC.sln
│  calc.vcxproj
│  calc.vcxproj.filters
│  CMakeCache.txt
│  cmake_install.cmake
│  ZERO_CHECK.vcxproj
│  ZERO_CHECK.vcxproj.filters
│
└─CMakeFiles

可以看到,在 Windows 系统下,默认情况下它生成了一个 Visual Studio 可以打开的工程。当然也可以使用 CLion 或者 Qt Creator 打开当前工程

而在 Linux 下是这样的:

 cmake ..
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/yuzu/cmake_proj/proj1/build

tree ./ -L 1
├── CMakeCache.txt
├── CMakeFiles
├── Makefile
└── cmake_install.cmake

1 directory, 3 files

在Linux 系统下,生成了一个 makefile 文件,还没有生成 calc 的可执行文件,只需要输入如下命令且运行:

make
[ 16%] Building CXX object CMakeFiles/calc.dir/main.cpp.o
[ 33%] Building CXX object CMakeFiles/calc.dir/div.cpp.o
[ 50%] Building CXX object CMakeFiles/calc.dir/sub.cpp.o
[ 66%] Building CXX object CMakeFiles/calc.dir/mul.cpp.o
[ 83%] Building CXX object CMakeFiles/calc.dir/add.cpp.o
[100%] Linking CXX executable calc
[100%] Built target calc

此时查看生成的文件,:

ls 
CMakeCache.txt  CMakeFiles  Makefile  calc  cmake_install.cmake

执行该二进制文件

./calc
9.32 19.4052 -3.04 0.508091

所以通过这种方式构建工程是没有问题的。

当然,这种 CMakeLists 文件是最简单的,但是具体工程中我们很难将所有的文件都写出来,而要采用一些其他的方式。

更新:

现代 CMake 提供了更方便的 -B--build 指令,不同平台,使用统一的命令:

cmake -B build
# 在源码目录中用 -B 直接创建 build 目录并生成 build/Makefile

cmake -build build -j4
# 自动调用本地的构建系统在 build 里构建,即:make -C build -j4

sudo cmake --build build --target install 
# 调用本地的构建系统执行 install 这个目标,即安装 
  • cmake -B build 免去了创建 build 再切换进去指定源代码的麻烦

  • cmake --build build 统一了不同平台(Linux 上会调用 make,Windows 上调用 devenv.exe)

posted @ 2024-07-15 10:41  kobayashilin1  阅读(12)  评论(0编辑  收藏  举报