• CMake教程 - basic point


    CMake教程 - basic point

    1 - Building a Basic Project

    最基本的CMake项目是由单个源代码文件构建的可执行文件。对于像这样简单的项目,只需要一个带有三个命令的CMakeLists.txt文件。

    注意:尽管CMake支持大写、小写和混合大小写命令,但小写命令是首选,并将在整个教程中使用。

    任何项目的顶级CMakeLists.txt都必须从使用cmake_minimum_required()命令指定一个最小的CMake版本开始。这将建立策略设置,并确保以下CMake功能使用兼容版本的CMake运行。要启动一个项目,我们使用project()命令来设置项目名称。这个调用对于每个项目都是必需的,并且应cmake_minimum_required()之后不久就被调用。我们将看到,此命令还可以用于指定其他项目级别信息,如语言或版本号。最后,add_executable()命令告诉CMake使用指定的源代码文件创建一个可执行文件。

    语法说明

    设置项目cmake最低版本要求

    cmake_minimum_required(VERSION [...] [FATAL_ERROR])
    
    • 1

    设置项目名称,同时也设定了几个环境变量

    project( [...])
    project(
            [VERSION [.[.[.]]]]
            [DESCRIPTION ]
            [HOMEPAGE_URL ]
            [LANGUAGES ...])
    PROJECT_SOURCE_DIR    当前source code 路径
    PROJECT_BINARY_DIR    当前source bin路径
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用指定的souce file 向项目中添加一个可执行文件

    add_executable( [WIN32] [MACOSX_BUNDLE]
                   [EXCLUDE_FROM_ALL]
                   [source1] [source2 ...])
    
    • 1
    • 2
    • 3

    demo

    main.c

    #include 
    
    int main(int argc, char **argv)
    {
        printf("hello world\n");
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    CMakeLists.txt

    #cmake version
    cmake_minimum_required(VERSION 3.2)
    
    #project name
    project(basic_demo)
    
    message("echo project dir is ${PROJECT_SOURCE_DIR}")
    message("echo project bin is ${PROJECT_BINARY_DIR}")
    #add executable
    add_executable(basic_demo main.c)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    编译

    可以创建一个文件夹用于存放cmake产生的文件,然后执行 cmake . , 编译文件cmake --build .

    2 - Specifying the C++ Standard

    CMake有一些特殊的变量,这些变量要么是在幕后创建的,要么是在项目代码中设置的。许多这些变量都以CMAKE开头。在为项目创建变量时避免这种命名约定。其中两个特殊的用户可设置变量是CMAKE_CXX_STANDARD和CMAKE_CXX_STANDARD_REQUIRED。它们可以一起用于指定构建项目所需的c++标准。

    变量说明

    CMAKE_CXX_STANDARD

    如果在创建目标器时设置了CXX STANDARD目标器属性的默认值,c++标准,其特性被要求构建此目标。此属性指定构建此目标所要求的c++标准的特性。对于某些编译器,这会导致在编译行中添加一个标志,如-std=gnu++11。对于没有标准级别概念的编译器,例如2015 Update 3之前的Microsoft Visual c++,这没有影响。支持的值有:

    CMAKE_CXX_STANDARDversion
    98C++98
    11C++11
    14C++14
    17C++17
    20C++20
    23C++23
    CXX_STANDARD_REQUIRED

    如果在创建目标器时设置了CXX_STANDARD_REQUIRED目标器属性,则该属性为默认值。

    描述CXX STANDARD的值是否是必需的。如果此属性设置为ON,则CXX_STANDARD目标属性的值被视为需求。如果此属性为OFF或未设置,则CXX_STANDARD目标属性被视为可选属性,并且如果所请求的不可用,则可能“衰减”到以前的标准。对于没有标准级别概念的编译器,例如MSVC 1800 (Visual Studio 2013)和更低的版本,这没有影响。

    demo

    main.cpp

    #include 
    
    int main(int argc, char **argv)
    {
        std::string var = "3.14156";
        const double input_value = std::stod(var);  //stod是c11 中有的 ,如果不设定cxx version 就会报错
    
        std::cout << input_value << std::endl;
        std::cout << "hello world " << std::endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    CMakeLists.txt

    #set cmake version
    cmake_minimum_required(VERSION 3.2)
    
    #project name
    project(basic_demo2)
    
    #set CXX version
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED true)
    
    #add executable
    add_executable(basic_demo2 main.cpp)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3 - Adding a Version Number and Configured Header File

    有时,在CMakelists.txt文件中定义的变量在源代码中也有,这可能很有用。在这种情况下,我们希望打印项目版本。实现这一点的一种方法是使用已配置的头文件。我们创建了一个包含一个或多个变量要替换的输入文件。这些变量具有特殊的语法,看起来像@VAR@。然后,我们使用coffet_file()命令将输入文件复制到给定的输出文件中,并将这些变量替换为CMakelists.txt文件中VAR的当前VAR值。虽然我们可以直接在源代码中编辑版本,但使用这个特性是首选,因为它创建了一个单一的真相来源,并避免了重复。

    变量说明

    _VERSION_MAJOR

    项目的主版本号

    _VERSION_MINOR

    项目的次版本号

    拷贝文件到另外一个位置并且修改内容

    configure_file( 
                   [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
                    FILE_PERMISSIONS ...]
                   [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
                   [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
    
    • 1
    • 2
    • 3
    • 4
    • 5

    input file和outfile对比

    inputfile					outfile
    #cmakedefine VAR			#define VAR or #undef VAR
    #cmakedefine VAR 1			#define VAR 01
    #cmakedefine01 VAR			#define VAR 1 or #define VAR 0
    
    input file中的变量使用@var@  or ${var} $CACHE{VAR} $ENV{VAR}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    加入头文件路径

    target_include_directories( [SYSTEM] [AFTER|BEFORE]
       [items1...]
      [ [items2...] ...])
    
    • 1
    • 2
    • 3

    demo

    main.cpp

    #include 
    #include "basicconfig.h"
    
    int main(int argc, char **argv)
    {
        std::cout << "verson major" << basic_demo_VERSION_MAJOR << "version minor" << basic_demo_VERSION_MINOR << std::endl;
        std::cout << "hello world " <
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.2)
    
    project(basic_demo VERSION 1.2)
    configure_file(basicconfig.h.in basicconfig.h)
    
    add_executable(basicdemo main.cpp)
    target_include_directories(basicdemo PRIVATE  ${PROJECT_SOURCE_DIR})           
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    basicconfig.h.in

    #define basic_demo_VERSION_MAJOR @basic_demo_VERSION_MAJOR@
    #define basic_demo_VERSION_MINOR @basic_demo_VERSION_MINOR@
    
    • 1
    • 2
  • 相关阅读:
    【算法学习】-【双指针】-【盛水最多的容器】
    图数据库 之 Neo4j - 应用场景3 - 知识图谱(8)
    启动tomcat的控制台乱码
    制作一个简单HTML旅游网站(HTML+CSS+JS)无锡旅游网页设计与实现8个页面
    诚邀莅临 | 天奥智能参展第86届中国国际医疗器械博览会
    Axure绘制星级评分
    【Vue】Vue2知识点总结
    26. 删除有序数组中的重复项
    Linux 学习的六个过程
    Spring注解大全,最后一个经常容易记不住
  • 原文地址:https://blog.csdn.net/qq_39678541/article/details/134080889