• cmake 命令


    编译方式

    • 内部编译

    • 外部编译

      mkdir build && cd build
      cmake .. && cmake --build . 
      
      • 1
      • 2

    CMAKE_BUILD_TYPE

    • Debug: 通常一个典型的debug构建包含调试信息,没有被优化等;
    • Release: 没有调试信息和完全优化的release构建;
    • RelWithDebInfo:: 和release一样,但具有调试信息;
    • MinSizeRel: 针对大小特殊优化的release;

    #cmake 命令行传入编译类型
    cmake -DCMAKE_BUILD_TYPE=debug .. 
    cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
    
    • 1
    • 2
    • 3

    cmake set变量设置

    • normal变量
      • 若cache中存在该变量,则值不会覆盖cache中值
      • 普通变量赋值,若想在function函数调用者中,或父级CMakeLists.txt中的变量中赋值生效,需要加PARENT_SCOPE关键字(相当于引用或指针传递),include、macro可以直接展开,和function、父级CMakeLists.txt同样效果
    set(varName value [PARENT_SCOPE])
    
    #根目录CMakeLists.txt
    set(numVar 10)
    message(STATUS ${numVar}) # 10
    
    add_subdirector(src)
    message(STATUS ${numVar}) # 10,还是输出10
    
    #parent_scope
    add_subdirector(math)
    message(STATUS ${numVar}) #20
    
    #function
    function(func arg1 isUpdate)
        message(STATUS ${numVar}) # 20
        if (not isUpate)
            set(arg 30)
        else
            set(arg 30 PARENT_SCOPE)
        endif()
        message(STATUS "${numVar}")
    endfunction()
    
    func(numVar, false)
    message(STATUS "${numVar}") #20
    
    func(numVar, true)
    message(STATUS "${numVar}") #30
    
    • 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
    • 27
    • 28
    • 29
    #src子目录CMakeLists.txt
    message(STATUS ${numVar}) # 10,可以直接访问numVar变量
    set(numVar 20) 
    
    • 1
    • 2
    • 3
    #math子目录CMakeLists.txt
    message(STATUS ${numVar}) # 10,可以直接访问numVar变量
    set(numVar 20 PARENT_SCOPE) #相当于引用或指针赋值,父级可访问修改后的值
    
    • 1
    • 2
    • 3
    • cache变量

      • 可以通过命令行-D形式对变量进行赋值并设置值到cache中,cache中有些内置cache变量,如CMAKE_INSTALL_PREFIX,CMAKE_BUILD_TYPE等
      • set(varName value CACHE type decription [FORCE]), 未添加FORCE,优先从cache中获取变量值,没有则将值设置到cache中;
      • 添加FORCE,无论cache是否存在,都使用该值
    • env 变量

      • set(ENV{varName} value)
      • 使用env变量message(STATUS $ENV{varName})

    Findxxx.cmake使用

    • 工程比较大时,需要创建自己的cmake模块,通过设置
      CMAKE_MODULE_PATH环境变量来告诉cmake模块在什么目录,在顶层CMakeLists.txt中设置
      set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
    • 引用外部包时,使用find_package()命令在顶层CMakeLists.txt的cmake目录下查找Findxxx.cmake文件
    • Findxxx.cmake文件撰写
      #find header position
      find_path(third_INCLUDE_DIR
        mymath.h #头文件
        "C:\\third" #指定头文件查找位置
      )
      
      #find lib position
      find_library(third_LIBRARY
        third
        "C:\\third\\Debug"
      )
      
      #设置third相关变量,调用方使用
      if (third_INCLUDE_DIR AND third_LIBRARY)
        set(third_FOUND TRUE)
        set(third_LIBRARIES ${third_LIBRARY})
      
        set(third_INCLUDE_DIRS ${third_INCLUDE_DIR})
      else()
        set(third_FOUND FALSE)
        message(WARNING "third not found")
      endif()
      #根据quiet or requied打印错误信息
      
      
      if(third_FOUND)
        #third_FIND_QUIETLY对应于quiet
        if (NOT third_FIND_QUIETLY)
            message(STAUTS "Found third lib:${third_LIBRARIES}")
        endif()
      else()
        #未找到
        #third_FIND_REQUIRED对应于required
        if (third_FIND_REQUIRED)
            message(FATAL_ERROR "could not find third")
        endif()
      endif()
      
      • 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
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
     #使用find_package
     find_package(third requied) #没找到报错
     if (third_FOUND)
       include_directories(${third_INCLUDE_DIRS})
       add_execute(Test Test.cpp)
       target_link_libraries(Test ${third_LIBRARIES})
     endif()  
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    监听div元素高度变化的方案
    05 图形学——图形渲染与颜色
    go语言|数据结构:二叉树(2)广度和深度搜索
    继承的使用以及细节问题
    Logback日志配置
    “快看”cms代码审计
    代码随想录-45-102. 二叉树的层序遍历
    Linux安全之iptables黑白名单
    氨基酸代谢:从基础到应用,揭示其在健康与疾病的角色
    南大通用数据库-Gbase-8a-学习-11-Oracle通过Dblink访问Gbase8a
  • 原文地址:https://blog.csdn.net/CodeHouse/article/details/126799627