Skip to Content

ref

功能

  • 使用CMakeLists.txt文件来描述项目如何构建,能够跨平台构建项目,并更好地处理依赖关系

实现

目录结构

  • CMakeLists.txt:构建关系文件
  • src/:源文件
  • bulid/:编译目录

CMakeLists

  • 最低版本要求cmake_minimum_required(VERSION 3.1)
  • 设置项目project()
    • 项目名称
    • 项目版本
    • 项目描述
    • 项目语言
project(MyProject VERSION 1.0 // 项目名称和项目版本 DESCRIPTION "Very nice project" // 项目描述 LANGUAGES CXX) // 项目语言
  • 添加可执行文件(.exe):add_executable()
    • 可执行文件名称
    • 源文件列表
  • 生成库:`add_library()
    • 库名称
    • 库类型
      • 静态库:STATIC,静态库在编译时会被链接到最终的可执行文件中
      • 动态库(.dll):SHARE,动态库会在运行时被加载
    • 源文件列表
  • 指定目标的包含目录target_include_directories(<target_name><include_type><include_path>)
    • 目标名称
    • 包含目录类型
      • PUBILC:指定的包含目录和编译选项不仅会被用于当前目标,还会被传递给所有依赖于当前目标的其他目标
      • PRIVATE:指定的包含目录和编译选项只会被用于当前目标,不会被传递给依赖于当前目标的其他目标
      • INTERFACE:指定只有当其他目标依赖于当前目标时才会使用的属性。这些属性不会用于当前目标本身
    • 包含目录路径
  • 为目标添加链接库target_link_libraries(<target_name><link_type><link_name>)
  • 输出目录控制set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
  • 保存目录文件到变量:`aux_source_directory( )
  • 查找并配置外部依赖库或软件包find_package(<PackageName> [version] [REQUIRED] [QUIET] [OPTIONAL_COMPONENTS <component1> <component2>])
    • <PackageName>:要查找的包的名称,通常是你要依赖的库或工具。
    • version:可选,指定要找到的包的版本。
    • REQUIRED:可选,表示如果找不到指定的包,CMake 会生成错误并停止配置。如果没有设置,找不到包时会产生警告。
    • QUIET:可选,表示如果找不到包,则不会显示警告。
    • OPTIONAL_COMPONENTS:可选,指定要查找的包的子组件。
cmake_minimum_required(VERSION 3.29.0)# 设置cmake最低版本 project(planning) # 设置项目名称 set(CMAKE_CXX STANDARD 17) # 指定 CMake 使用 C++17 标准来编译 C++ 源文件 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) # 指定输出目录 aux_source_directory(${PROJECT SOURCE DIR}/src SRC_LISTS) # 使用SRC_LISTS保存根目录下src文件夹中文件 # 使用src中文件,创建动态库common add library(common SHARED ${SRC_LISTS} ) #为common动态库包含include目录 target_include_directories(common PUBLIC ${PROJECT_SOURCE_DIR}/include ) add_executable(planning_main planning_main.cpp) # 使用planning_main.cpp,创建可执行文件planning_main.exe # 为planning main可执行文件包含include目录 target_include_directories(planning main PUBLIC ${PROJECT SOURCE DIR}/include ) # 为planning main可执行文件链接common动态库 target_link_libraries(planning main PUBLIC common )

构建项目

~/package $ cmake -S . -B build -G "MinGW Makefiles" # 指定源码为当前目录,并在build目录下生成构建系统所需文件,指定使用MinGW ~/package $ cmake --build build # 在build目录下执行编译过程,将源码编译成可执行文件

细节

概念解释

  • 目标:
  • 包含目录:告诉编译器在哪里可以找到头文件的目录
  • 链接库:告诉链接器在最终生成可执行文件或库文件时需要链接哪些库
Last updated on