当前位置: 首页 > news >正文

『CMake』关于使用CMake构建项目时的现代/传统指令

写在前面

最近才注意到使用CMake构建和编译项目时,使用的指令存在传统和现代两种写法,记录一下以备不时之需

概述

两种写法本质等价,差别仅在是否“生成器无关”、可移植性、脚本化友好,以及是不是只在类 Unix 上用 make
具体来说有以下的区别:

  • 并行开关:现代 cmake --build … --parallel 跨平台统一;传统 -j$(nproc) 只在类 Unix 顺手
  • 配置选择:单配置(Make/Ninja)用 -DCMAKE_BUILD_TYPE=…;多配置(VS/Xcode)用 --config …
  • 可移植性:现代命令一套走天下;传统命令依赖具体构建器与 shell
  • 工作流:现代天然 out-of-source,多构建目录好管理;传统常手动 cd build,容易写出“把中间文件丢源码树”的脚本
  • 生态与可维护性:现代写法更容易接入 presets、打包、安装、工具链文件(-DCMAKE_TOOLCHAIN_FILE=…)等现代 CMake 习惯

最后,无论如何都更加推荐使用现代写法,除非是古早项目或者项目指定使用旧版本的cmake

现代写法

cmake -S <src> -B <build> [-DCMAKE_BUILD_TYPE=Release] [-DCMAKE_INSTALL_PREFIX=$PWD/install]
cmake --build <build> --parallel
cmake --install <build>   # 需要时

其中<src>是源码目录,<build>是构建和编译目录,通常是名为build的文件夹

特性

  • 生成器无关cmake --build 会自动调用对应的构建器(ninja/make/msbuild/xcodebuild),同一套命令跑遍 Linux/Windows/macOS
  • 多配置友好(VS/Xcode 这类多配置生成器):配合 --config Release/Debug 使用,而不是 CMAKE_BUILD_TYPE
  • 目录干净:天然 out-of-source(-S/-B),多个构建目录(Debug/Release/ASan…)并存不打架
  • 脚本/CI 友好:选项清晰、可预测;再配合 CMakePresets.json 更香
  • 一致并行参数--parallel 统一了 -jN 的差异(Windows 上没有 nproc 这类工具)
  • 更易移植:切换 Ninja、VS、Xcode、Make 都不用改命令

适用场景

  • 跨平台维护(同一仓在 Linux + Windows + macOS 上编译)
  • 需要多配置并存(Debug/Release/ASan/TSan)或不同工具链(gcc/clang/clang-cl)
  • CI/CD、容器、脚本化构建,或要用 CMakePresets.json 做一键配置
  • 使用 Ninja、MSBuild、Xcode 等非 make 生成器
  • 需要 cmake --install 做安装打包、CPack 出包

传统写法(类 Unix 风格)

mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j$(nproc)

特性

  • 绑定单一生成器:默认是 “Unix Makefiles”。换 Ninja/VS/Xcode 时命令要跟着改(如 ninjamsbuild
  • 单配置思维CMAKE_BUILD_TYPE 只对单配置生成器(Makefiles/Ninja)直观。VS/Xcode 下常被忽略,需要改用 --config
  • shell 依赖$(nproc)、管道、小工具在 Windows 上不可用或语法不同
  • 上手快:在纯 Linux + make 的环境里,肌肉记忆强,输入最短

适用场景

  • 只在 Linux/Unix 上、只用 make,团队已有大量历史脚本/文档
  • 个人本机快速编译、对跨平台不敏感
  • CMake 版本老(非常老的发行版上没有 -S/-B / --install / --parallel

其他环境的写法

  • Linux + Ninja(推荐构建器,速度快)

    cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
    cmake --build build --parallel
    
  • Linux + Make(传统)

    mkdir -p build && cd build
    cmake -DCMAKE_BUILD_TYPE=Release ..
    make -j"$(nproc)"
    
  • Windows + Visual Studio(多配置)

    cmake -S . -B build -G "Visual Studio 17 2022"
    cmake --build build --config Release --parallel
    
  • macOS + Xcode(多配置)

    cmake -S . -B build -G Xcode
    cmake --build build --config Release --parallel
    
http://www.dtcms.com/a/511414.html

相关文章:

  • 请被人做网站怎么做倒计时网站
  • App开发框架调研对比
  • Ubuntu下载以及安装详解以及应用安装
  • 亚马逊云代理:AWS的EC2, S3, RDS,Lambda具体简介
  • 2640. QYQ在艾泽拉斯
  • 基于 React + TypeScript + Fabric.js 构建一个封面生成器网站
  • 营销型电子商务网站品牌建设与推广思路
  • 更新网站 seo公司的管理方式与管理方法
  • BZV49-C22,115稳压二极管 NXP安世半导体 工业电源芯片 芯片解析
  • 职场发展—如何避雷垃圾公司
  • 【Linux篇】软链接vs硬链接:Linux文件系统中的两种引用机制
  • C++ list核心接口与实战技巧
  • 微服务框架
  • 网站模块结构图wordpress调用栏目名称
  • 算法学习记录03——二叉树学习笔记:从两道题看透后序位置的关键作用​
  • Rust高性能分布式任务调度系统开发实践:从设计到性能优化
  • go tools安装
  • 阿里云代理商:如何给阿里云配置网络ACL?
  • 阿里巴巴 Java 开发手册解读:DO、DTO、BO、AO、VO、Query 的区别与用法
  • 接口测试如何做
  • 记录日常日志
  • 【LeetCode_876_2.02】快慢指针在链表中的简单应用
  • LOOP套LOOP,双LOOP优化,效率提升近30倍
  • iOS 混淆实战 多工具组合完成 IPA 混淆、加固与工程化落地(iOS混淆|IPA加固|无源码混淆|Ipa Guard|Swift Shield)
  • 计算机毕设java中学生心理健康管理系统 中学生心理健康管理的Java平台解决方案 Java技术驱动的中学心理健康管理系统研发
  • 模重复平方计算法
  • 温州网站制作套餐.net网站开发是什么对象开发
  • Tuning——CC调试(适用高通)
  • 【AI智能体开发】什么是LLM?如何在本地搭建属于自己的Ai智能体?
  • Leetcode+Java+图论+并查集