zoukankan      html  css  js  c++  java
  • CMake语法—函数(简单参数)

    CMake语法—函数(简单参数)

    1 CMake函数简单参数示例

    1.1 CMakeLists.txt

    cmake_minimum_required(VERSION 3.18)
    
    # 设置工程名称
    set(PROJECT_NAME KAIZEN)
    
    # 设置工程版本号
    set(PROJECT_VERSION "1.0.0.10" CACHE STRING "默认版本号")
    
    # 工程定义
    project(${PROJECT_NAME}
        LANGUAGES CXX C
        VERSION ${PROJECT_VERSION}
    )
    
    # 打印开始日志
    message(STATUS "##########BEGIN_TEST")
    
    # 定义函数
    function(test_argument age)
        # 打印ARGN参数值
        message(STATUS "ARGN: ${ARGN}")
        # 打印ARGC参数值
        message(STATUS "ARGC: ${ARGC}")
        # 打印ARGV参数值
        message(STATUS "ARGV: ${ARGV}")
        # 打印ARGV0参数值
        message(STATUS "ARGV0: ${ARGV0}")
        
        # 打印参数个数
        list(LENGTH ARGV argv_len)
        message(STATUS "length of ARGV: ${argv_len}")
        
        # 遍历打印各参数值
        set(i 0)
        while(i LESS ${argv_len})
            list(GET ARGV ${i} argv_value)
            message(STATUS "argv${i}:${argv_value}")
            math(EXPR i "${i} + 1")
        endwhile()
    endfunction()
    
    # 调用函数形式1
    ## test_argument() error!因为此函数必须至少有一个参数
    
    # 调用行数形式2
    test_argument(20)
    
    # 调用函数形式3
    test_argument(18 "kaizen" "beijing" "baidu" 60)
    
    # 打印结束日志
    message(STATUS "##########END_TEST")
    
    

    1.2 执行CMake配置(cmake_config.bat)脚本

    @echo off
    set currentDir=%~dp0
    set buildDir=%currentDir%
    set cmakeOutputDir=%currentDir%\build
    cmake -S %buildDir% -B %cmakeOutputDir% -G"Visual Studio 16 2019" -T v140 -A x64
    pause
    

    1.3 目录结构

    • learn_cmake:为根目录
    • build:为CMake配置输出目录(在此例中即生成sln解决方案的地方)
    • cmake_config.bat:执行CMake配置过程的脚本(双击直接运行)
    • CMakeLists.txt:CMake脚本

    2 运行结果

    2.1 环境说明

    本地安装VS版本:Visual Studio 2019(2015工具集)

    CMake版本:3.18.2

    F:\learn_cmake
    λ cmake --version
    cmake version 3.18.2
    
    CMake suite maintained and supported by Kitware (kitware.com/cmake).
    

    2.2 运行结果

    -- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.17763.
    -- The CXX compiler identification is MSVC 19.0.24245.0
    -- The C compiler identification is MSVC 19.0.24245.0
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe - skipped
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe - skipped
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- ##########BEGIN_TEST
    -- ARGN:
    -- ARGC: 1
    -- ARGV: 20
    -- ARGV0: 20
    -- length of ARGV: 1
    -- argv0:20
    -- ARGN: kaizen;beijing;baidu;60
    -- ARGC: 5
    -- ARGV: 18;kaizen;beijing;baidu;60
    -- ARGV0: 18
    -- length of ARGV: 5
    -- argv0:18
    -- argv1:kaizen
    -- argv2:beijing
    -- argv3:baidu
    -- argv4:60
    -- ##########END_TEST
    -- Configuring done
    -- Generating done
    -- Build files have been written to: F:/learn_cmake/build
    请按任意键继续. . .
    

    2.3 结论

    2.3.1 函数定义时有几个形参,调用时至少必需有相同个数的实参

    从示例程序43行分析可得:函数test_argument定义时,有一个年龄参数age,但是43行调用时,未输入任何实参,调用错误CMake Error。

    2.3.2 ARGN:代表除过必需实参而外其它多余实参

    从示例程序输出日志15、21行可以分析而得:

    代码46行第一种调用形式,只有一个实参20,其对应的形参为age,即函数必需的一个参数。

    所以,ARGN结果为空,意即除过必需实参而外没有其他多余实参。

    而代码49行第二种调用形式,总共有5个实参,第一个实参18,其对应的形参为age,即函数必需的一个参数。

    所以,ARGN结果为“kaizen;beijing;baidu;60”,意即除过必须实参而外合计还有4个多余实参。

    2.3.3 ARGC:代表所有实参的个数

    从示例程序输出结果16、22行可以分析而得。

    2.3.4 ARGV:代表所有实参的值(注意:用分号拼接在一起)

    从示例程序输出结果17、23行可以分析而得。

    2.3.5 ARGV0:代表第一个实参值;ARGV1,代表第二个实参值;以此类推。
  • 相关阅读:
    jquery的each()详细介绍
    JQuery中$.ajax()方法参数详解
    JavaScript DES 加密tripledes.js:
    springboot自动装备date类型报错问题
    java中有个很强大的工具jconsole.exe
    第11章 Spring Boot使用Actuator
    springboot集成Spring Session
    springboot集成redis使用redis作为session报错ClassNotFoundException类RememberMeServices
    精进之道——不要在工作时三心二意分散精力
    springboot配置对jsp页面的解析支持
  • 原文地址:https://www.cnblogs.com/Braveliu/p/15586699.html
Copyright © 2011-2022 走看看