• CMake教程(一)


    CMake官方文档

    参考官方cmake3.24教程翻译。我这里使用cmake 3.16来演示例子。
    https://cmake.org/cmake/help/v3.24/guide/tutorial/A%20Basic%20Starting%20Point.html

    1、基础的起点

    构建并运行一个最基础的项目(从源代码文件构建的可执行文件),这将是我们教程的起点。

    1.1、创建项目文件夹

    创建项目文件夹rd-project, 并进入

    mkdir rd-project
    cd rd-project
    
    • 1
    • 2

    1.2、创建源代码文件

    源代码文件tutorial.cxx, 文件内容同官方教程计算平方根的代码tutorial.cxx (在cmake源码Step1目录中提供)

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <math.h> 
    int main(int argc, char* argv[]){ 
        if(argc<2){ 
            fprintf(stdout, "Uage: %s number\n", argv[0]); 
            return 1; 
        } 
        double inputValue = atof(argv[1]); 
        double outputValue = sqrt(inputValue); 
        fprintf(stdout, "The square root of %g is %g\n",inputValue, outputValue); 
        return 0; 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    1.3、编写CMakeLists.txt文件

    在Step1目录中创建一个CMakeLists.txt文件,最基础的项目只需要一个三行CMakeLists.txt文件。

    vi CMakeLists.txt
    
    • 1
    # cmake版本 # 查看cmake版本cmake --version 这里用的3.16
    cmake_minimum_required(VERSION 3.16)
    
    # 工程名
    project(Tutorial) 
    
    #  添加app的源文件
    add_executable(Tutorial tutorial.cxx) 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意,这个例子在CMakeLists.txt文件中使用了小写命令。CMake支持大写、小写和混合大小写命令。

    2、构建和运行

    2.1、创建一个构建目录

    cd ..
    mkdir rd_build
    
    • 1
    • 2

    2.2、生成本地构建系统

    进入构建目录并运行CMake来配置项目并生成一个本地构建系统

    cd rd_build
    cmake ../rd-project
    
    • 1
    • 2

    2.3、实际编译/链接项目

    通过本地构建系统来实际编译/链接项目:

    cmake --build .
    
    • 1

    至此,构建编译完成。
    image.png

    2.4、尝试运行可执行程序

    ./Tutorial 4294967296
    ./Tutorial 10
    ./Tutorial
    
    • 1
    • 2
    • 3

    运行结果如下
    image.png

    3、为项目添加版本号和可配置的头文件

    我们将添加的第一个特性是为我们的可执行文件和项目提供一个版本号。虽然我们可以在源代码中单独完成此操作,但使用CMakeLists.txt提供了更大的灵活性。

    3.1、使用project()命令设置项目名称和版本号

    cmake_minimum_required(VERSION 3.16)
    
    # set the project name and version
    project(Tutorial VERSION 1.0)
    
    • 1
    • 2
    • 3
    • 4

    3.2、配置一个头文件,将版本号传递给源代码

    configure_file(TutorialConfig.h.in TutorialConfig.h)
    
    • 1

    3.3、由于配置文件将被写入到二叉树中,我们必须将该目录添加到路径列表中以搜索包含文件。

    target_include_directories(Tutorial PUBLIC
                               "${PROJECT_BINARY_DIR}"
                               )
    
    • 1
    • 2
    • 3

    3.4、使用你喜欢的编辑器,在源目录下创建TutorialConfig.h.in,包含以下内容:

    // the configured options and settings for Tutorial@@引用的变量可以通过CMakeLists.txt来设置 
    #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
    #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
    
    • 1
    • 2
    • 3

    当CMake配置这个头文件时,@Tutorial_VERSION_MAJOR@和@Tutorial_VERSION_MINOR@的值将被替换。
    tutorial.cxx中包含配置头文件TutorialConfig.h
    更新tutorial.cxx源码,打印出可执行文件的名称和版本号。cxx内容如下:

    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include "TutorialConfig.h" 
    
    int main(int argc, char *argv[]) {
      if (argc < 2) {
        // report version
        std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."
                  << Tutorial_VERSION_MINOR << std::endl;
        std::cout << "Usage: " << argv[0] << " number" << std::endl;
        return 1;
      }
    
    //   double inputValue = atof(argv[1]);
      const double inputValue = std::stod(argv[1]);
      double outputValue = sqrt(inputValue);
      fprintf(stdout, "The square root of %g is %g\n", inputValue, outputValue);
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    4、指定c++标准

    接下来,让我们在tutorial.cxx中将atof替换为std::stod,为我们的项目添加一些c++ 11特性。同时,删除
    #include 。

    //文件tutorial.cxx
    
    //   double inputValue = atof(argv[1]);
      const double inputValue = std::stod(argv[1]);
    
    • 1
    • 2
    • 3
    • 4

    我们需要在CMake代码中显式地声明它应该使用的正确标准。
    在CMake中启用对特定c++标准的支持最简单的方法是使用CMAKE_CXX_STANDARD变量。
    在本教程中,将cmakellists .txt文件中的CMAKE_CXX_STANDARD变量设置为11,并将CMAKE_CXX_STANDARD_REQUIRED设置为True。
    必须确保在add_executable调用的上方添加了CMAKE_CXX_STANDARD声明。
    教程到此时,完整的CMakeLists.txt内容如下:

    # cmake版本 # 查看cmake版本cmake --version 这里用的3.16
    cmake_minimum_required(VERSION 3.16)
    
    # specify the C++ standard
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED True)
    
    # 工程名
    # project(Tutorial) 
    # set the project name and version
    project(Tutorial VERSION 1.0)
    
    #  添加app的源文件
    add_executable(Tutorial tutorial.cxx) 
    
    # 配置文件
    configure_file(TutorialConfig.h.in TutorialConfig.h)
    
    target_include_directories(Tutorial PUBLIC
                               "${PROJECT_BINARY_DIR}"
                               )
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    5、重新构建并测试更改

    参考上文步骤 2.2 到 2.4 进行重构,并尝试运行可执行程序,观察更改
    image.png
    image.png

  • 相关阅读:
    Lightrun还可以这样用?
    龙芯处理器首次成功运行 OpenHarmony ;Log4j 被发现存在第三个漏洞;PyPI 服务出现中断 | 开源日报
    KDD 2023 | WHEN异构时间序列分析模型:当Wavelet和DTW遇上Attention
    Redis Hotkey?3招定位+5招解决
    近两年国内外主流物联网操作系统简介
    行秋的Buffer
    100-centos 安装mysql
    解决checkbox设置数字无法展示的错误
    redis中永久设置密码与设置密码后使用密码登录
    docker安装mysql exporter并使用grafana+prometheus监控mysql
  • 原文地址:https://blog.csdn.net/fanrongwoaini/article/details/125480854