cmake 命令

编译方式

  • 内部编译

  • 外部编译

    mkdir build && cd build
    cmake .. && cmake --build . 
    

CMAKE_BUILD_TYPE

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

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

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
#src子目录CMakeLists.txt
message(STATUS ${numVar}) # 10,可以直接访问numVar变量
set(numVar 20) 
#math子目录CMakeLists.txt
message(STATUS ${numVar}) # 10,可以直接访问numVar变量
set(numVar 20 PARENT_SCOPE) #相当于引用或指针赋值,父级可访问修改后的值
  • 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()
    
 #使用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()  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值