1.1 cMake入门

1. 约定:
  命令:PROJECT()ADD_EXECUTABLE()(推荐大写)
  变量:PROJECT_NAMECMAKE_CXX_STANDARD(大写)
    a.定义变量
    set(MY_VAR "hello")
set(NUM 123)
# 列表(用分号分隔)
set(SRC_LIST main.cpp;foo.cpp;bar.cpp)
# 等价写法
set(SRC_LIST
    main.cpp
    foo.cpp
    bar.cpp
)

    b.使用变量
    message(${MY_VAR})
add_executable(demo ${SRC_LIST})

    c.常用变量
    ${PROJECT_NAME} # project()设置的项目名
${CMAKE_SOURCE_DIR} # CMakeLists.txt所在根目录(源码根目录)
${CMAKE_BINARY_DIR} # 构建输出目录(build目录)
${CMAKE_CURRENT_SOURCE_DIR} # 当前CMakeLists.txt所在目录
${CMAKE_CURRENT_BINARY_DIR}# 当前构建目录
${CMAKE_CXX_COMPILER} # C++编译器
${CMAKE_C_COMPILER} # C编译器
    

  注释:# 单行注释,没有多行注释
2. 基础命令
  2.1.  project () 项目声明
    project(MyDemo LANGUAGES C CXX) # LANGUAGES 指定语言:C/CXX/ASM  

  2.2.message () 打印日志
    message(STATUS "构建开始") # 普通信息
message(WARNING "警告")
message(FATAL_ERROR "致命错误,直接终止cmake")

  2.3.add_executable () 生成可执行程序
    # 可执行文件名 源码列表
add_executable(demo main.cpp util.cpp)

  2.4.add_library () 生成库
    # 静态库libxxx.a / xxx.lib
add_library(mylib STATIC util.cpp)

# 动态库 libxxx.so / xxx.dll
add_library(mylib SHARED util.cpp)

# 目标库别名(方便链接)
add_library(mylib::mylib ALIAS mylib)

  2.5 target_link_libraries 链接库
    # demo 链接 mylib
target_link_libraries(demo PRIVATE mylib)

3.三个作用域:

  • PRIVATE:目标自己用,不对外暴露头文件
  • PUBLIC:自己用,同时传递给依赖它的其他目标
  • INTERFACE:只对外暴露,自身不使用

4.target_include_directories 设置头文件路径
  target_include_directories(demo
  PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/include
)

5.set 设置编译标准
  set(CMAKE_CXX_STANDARD 17) # C++17
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制要求,不允许降级
set(CMAKE_CXX_EXTENSIONS OFF) # 关闭编译器扩展(如GNU扩展)

6. if条件判断
  if(WIN32)
  message(STATUS "Windows平台")
elseif(UNIX)
  message(STATUS "Linux/macOS")
else
  message(STATUS "Android")
endif()

  6.1 常用判断
  # 判断变量是否存在
if(MY_VAR) endif()

# 取反
if(NOT MY_VAR) endif()

# 逻辑与、或
if(A AND B)
if(A OR B)

# 判断文件/目录存在
if(EXISTS "${CMAKE_SOURCE_DIR}/include")
endif()

# 判断是否相等
if(${CMAKE_CXX_STANDARD} STREQUAL "17")
endif()

  6.2 平台内置判断宏:

    WIN32:Windows
    UNIX:Linux、macOS
    APPLE:macOS / iOS
    LINUX:Linux

7. 循环 foreach
  set(FILE_LIST a.cpp b.cpp c.cpp)

foreach(file ${FILE_LIST})
  message("文件:${file}")
endforeach()

# 数字循环
foreach(i RANGE 1 10)
  message(${i})
endforeach()

8. 函数与宏(function /macro)
  8.1 function(推荐,拥有独立作用域)
    function(print_msg MSG)
  message("消息:${MSG}")
endfunction()

print_msg("Hello CMake")

  8.2 macro(变量作用域全局,容易踩坑,谨慎使用)
    macro(print_macro MSG)
  message("macro: ${MSG}")
endmacro()

9. 子目录 add_subdirectory(工程分层,多个模块时使用)
  # 进入src目录,执行src/CMakeLists.txt
add_subdirectory(src)
add_subdirectory(thirdparty)

10. option 开关选项(方便编译时开启 / 关闭功能)
  option(ENABLE_LOG "开启日志打印" ON)

if(ENABLE_LOG)
  message("日志已开启")
endif()

注意:编译时以用  cmake -DENABLE_LOG=OFF ..  覆盖 option(ENABLE_LOG "开启日志打印" ON)

11. 字符串操作 string
  string(TOUPPER hello OUT)
message(${OUT})

12. 最简完整示例 CMakeLists.txt

cmake_minimum_required(VERSION 3.16)  # 最低cmake版本要求

project(Demo LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 源码列表
set(SRC
    main.cpp
)

# 生成可执行文件
add_executable(demo ${SRC})

# 头文件目录
target_include_directories(demo PRIVATE ${CMAKE_SOURCE_DIR}/include)

13. 常用构建命令
  # 创建build目录,外部构建(推荐,不要源码内编译)
  mkdir build && cd build
  cmake ..
  make -j8

  # Windows MSVC 下
  cmake ..
  cmake --build .
14. 易错点
  image

posted @ 2026-08-18 11:18  Vak  阅读(3)  评论(0)    收藏  举报
zhanghz production