怎么利用360域名做网站,电子商务网站规划设计方案,wordpress 开发教程,阿里云官网场景#xff1a;我们要编译我们的工程 Linux 平台#xff1a;手写 Makefile#xff0c;通过make命令编译Windows 平台#xff1a;配置工程构建属性#xff0c;点击 “生成解决方案#xff08;B#xff09;”#xff0c;或使用快捷键CtrlShiftB#xff1b;也可在解决方…场景我们要编译我们的工程Linux 平台手写 Makefile通过make命令编译Windows 平台配置工程构建属性点击 “生成解决方案B”或使用快捷键CtrlShiftB也可在解决方案上运行 Build Insights、重新生成解决方案R、清理解决方案C、为解决方案生成完整程序数据库文件、对解决方案运行代码分析AltF11等操作缺点跨平台需要手动适配每平台下构建系统对应的构建配置文件Makefile 语法复杂特别是中大型项目手写基本不现实注构建 编译白话 CMake - 真实世界里的例子场景类比传统方式CMake 方式生产月饼纯手工雕刻厂家直销自动生成对应 “工具”工程构建手动编写 Makefile 等配置文件自动生成各个构建系统对应的配置文件CMake 最核心的功能自动生成各个构建系统对应的配置文件CMake 还有哪些优势优势传统方式CMake 方式改进效果解决跨平台构建难题人工编辑 Makefile 等配置文件CMake 自动帮我们生成构建配置文件一处配置到处构建语法简单易上手Makefile 等语法复杂语法简单表达能力强大大幅减少学习成本提升研发效率解决包管理难题手动查找包自动查找包包管理规范化多 IDE 支持每个 IDE 都有自己的构建方式各个 IDE 都支持使用 CMake 来构建程序一处配置多 IDE 支持IDE 对 CMake 支持情况主流 C 商业级开发 IDE 对 CMake 的支持度高具体如下IDE厂商WindowsLinux类型CMake 支持主要特点Visual StudioMicrosoft✅❌免费 / 付费最强 Windows C 开发IntelliSenseVisual Studio CodeMicrosoft✅✅免费轻量级丰富插件CLionJetBrains✅✅付费智能代码分析跨平台CursorAnysphere✅✅付费AI 原生编程Claude/GPT-4 集成智能代码生成结论目前主流的 IDE 都支持 CMake 插件支持 CMake 语法高亮、代码补全。上述 IDE 都可以自动解析 CMake 配置文件然后在各自的 IDE 里继续构建工程。CMake 语法简单易上手功能强大使用广泛IDE 支持度高已经是 C/C 事实上的构建标准也是一个十分重要的 C/C 工程管理工具。学好 CMake不但能让你的 C/C 工程优雅高效也能提升你的个人竞争力。1. CMake 快速开始1.1 CMake 安装后续章节所有 cmake 命令执行环境编辑环境VS Code编译环境VS Code Remote SSH 模式 Ubuntu 24.04相关链接CMake 官方源代码下载地址https://cmake.org/download/CMake 官方英文文档地址https://cmake.org/cmake/help/latest/index.html安装步骤Step 1使用 ubuntu 自带 apt 安装sudo apt install cmakeStep 2验证安装安装完成后可通过以下命令验证 CMake 是否安装成功以及查看其版本cmake --version示例输出cmake version 3.28.3 CMake suite maintained and supported by Kitware (kitware.com/cmake).版本号说明不同 Linux 发行版的软件仓库中预装的 CMake 版本可能随系统版本更新而变化系统版本越新预装的 CMake 版本通常也越新。典型的版本对照表如下Linux 发行版版本预装 CMake 版本Ubuntu LTS22.04 (Jammy)3.22通过 apt 安装Ubuntu LTS24.04 (Noble)3.28默认版本更高Debian12 (Bookworm)3.22Fedora393.28CentOs Stream93.22Arch Linux滚动更新最新稳定版如 3.28后续我们章节对 CMake 版本最低要求是3.18⚠️1.2 VS Code CMake 插件安装插件官方文档https://code.visualstudio.com/docs/cpp/cmake-linux插件好处语法高亮和代码补全对 CMakeLists.txt 文件提供语法高亮显示使代码结构更加清晰易读同时支持代码补全功能输入 CMake 命令或变量时插件会自动提示可能的选项减少手动输入的错误和时间。智能分析和错误检查能够对 CMakeLists.txt 文件进行智能分析检查其中的语法错误和潜在问题并在编辑器中实时显示错误提示和警告信息帮助及时发现和解决问题。安装步骤Step 0打开 VS Code点击左侧活动栏中的扩展图标或按CtrlShiftX。Step 1在搜索框中输入 CMake选择安装以下 4 个插件CMaketwxs 开发CMake ToolsMicrosoft 开发CMake Language SupportJose Torres 开发CMake IntelliSenseKylin-IDE Team 开发Step 2挨个点击 Install 按钮等待安装完成即可。1.3 快速样例 - hello world 工程现在我蛮将使用一个例子演示如何用 CMake 构建一个最简单的 C 程序快速了解 CMake 的使用方式。工程生成流程CMakeLists.txt → cmake → Makefile → make → g → main可执行文件操作步骤Step 0目录结构hello_world/ ├── CMakeLists.txt └── main.cppStep 1新建文件 - main.cpp#include iostream int main() { std::cout hello world! std::endl; return 0; }Step 2新建文件 - CMakeLists.txt# 1 设置能运行此工程的cmake的最低版本 cmake_minimum_required(VERSION 3.18) # 2 设置项目名称 project(helloWorld) # 3 添加构建目标 add_executable(main main.cpp)关键问题说明为什么需要设置最低的 cmake 版本CMake 是一个不断迭代的工具目前最新 4.x历史有 3.x不同版本可能会引入新的语法、命令、模块或行为变更。如果项目中使用了高版本 CMake 才支持的特性例如特定的函数、生成器表达式、目标属性等而用户本地安装的 cmake 版本低于项目要求的版本就会出现无法解释或者产生不可预知的行为。为了防止以上情况出现CMake 提供了cmake_minimum_required命令会在配置阶段cmake 命令执行时检查当前 CMake 版本若当前版本低于最低要求CMake 会直接终止并报错明确提示 “需要至少 X.X 版本”避免后续因版本不兼容导致的模糊错误。若当前安装的版本满足要求则继续执行后续配置流程。CMake 里的 “目标” 是什么在 CMake 中“目标Target” 代表了一个需要被生成的实体如可执行文件、静态库 / 动态库等和 Makefile 里的目标是一个意思这是 CMake 里最核心的 3 个概念之一后面章节会详细介绍。Step 3运行 cmake# 先创建build目录并进入推荐源外构建 mkdir build cd build # 运行CMake命令生成Makefile cmake ..示例输出-- The C compiler identification is AppleClang 17.0.0.17000013 -- The CXX compiler identification is AppleClang 17.0.0.17000013 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done ..... -- Build files have been written to: /Users/lixiaoshen/Desktop/CMakeDemo/hello_world/buildStep 4编译 链接make示例输出[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o [100%] Linking CXX executable main [100%] Built target mainStep 5运行程序./main示例输出./main hello world!2. CMake 命令行工具介绍2.1 CMake 工程构建流程图编写工程代码 ↓ CMake 配置阶段cmake .. → 读取 CMakeLists.txt → 生成 Makefile、cmake_install.cmake、CPackConfig.cmake 等所有脚本 ↓ CMake 生成阶段结束 ↓ make 编译调用 Makefile 里的 all 目标 ↓ CTest 测试make test → 调用 CTest 脚本 ↓ Install 安装make install → 调用 cmake_install.cmake ↓ CPack 打包make package → 调用 cpack → 调用 cmake_install.cmake完整命令流程# 1. 创建构建目录 mkdir build cd build # 2. 配置项目核心生成所有脚本文件 cmake .. # 【原理】 # CMake 读取 ../CMakeLists.txt # 自动在 build 目录生成 # → Makefile主构建文件 # → cmake_install.cmake安装专用脚本 # → CPackConfig.cmake打包专用脚本 # → CTestTestfile.cmake测试专用脚本 # 3. 构建项目 make # 【原理】 # 调用 Makefile 文件里的 **all 伪目标** # 执行编译、链接生成可执行文件 # 4. 执行测试 make test # 【原理】 # 调用 Makefile 里的 **test 伪目标** # 内部执行 ctest 命令 # ctest 读取 CTestTestfile.cmake 运行测试 # 5. 安装项目 make install # 【原理】这是你最关心的 # 调用 Makefile 里的 **install 伪目标** # Makefile 内部执行 # cmake -P cmake_install.cmake # 真正执行拷贝、安装的是 cmake_install.cmake 脚本 # 6. 生成安装包 make package # 【原理】 # 调用 Makefile 里的 **package 伪目标** # Makefile 内部直接调用cpack # cpack 读取 CPackConfig.cmake # cpack **内部也会调用 cmake_install.cmake** # 把文件安装到临时目录再打包 # 7. 解压 tar xvf TestCMakeTools-0.1.1-Linux.tar.gz示例工程目录结构cmake_tools/ 这就是【项目根目录】 ├── build/ ├── CMakeLists.txt 根目录下必须有这个 ├── main.cpp └── test.cpp示例文件内容Step 1新建文件 - main.cpp#include iostream int main() { std::cout hello world! std::endl; return 0; }Step 2新建文件 - test.cpp#include iostream #include cassert int main() { assert(1 2 3); std::cout test passed! std::endl; return 0; }Step 3修改文件 - CMakeLists.txt# 1 设置能运行此cmake工程的最低cmake版本要求 cmake_minimum_required(VERSION 3.18) # 2 设置项目名称 project(helloWorld) # 3 添加构建目标 # 生成主程序 add_executable(main main.cpp) # 生成测试二进制可执行程序 add_executable(testAdd test.cpp) # 4 开启测试功能 集成测试逻辑 include(CTest) add_test( NAME Case_Add COMMAND testAdd ) # 5 安装二进制可执行程序到本地 include(GNUInstallDirs) install(TARGETS main) # 6 开启打包功能 打包二进制可执行程序 include(CPack) # cpack 默认收集install对应的目标然后会把收集到的目标打包在压缩包里2.2 生成构建系统CMake 参考文档 — CMake 4.2.2 文档CMake 命令格式cmake [options] path-to-source cmake [options] path-to-existing-build cmake [options] -S path-to-source -B path-to-build参数含义-S指定源文件根目录必须包含一个 CMakeLists.txt 文件-B指定构建目录构建生成的中间文件和目标文件的生成路径通常会保存一个 CMakeCache.txt 来存储一些变量核心概念源文件目录Source Tree指项目源代码的目录结构CMake 通过 CMakeLists.txt 文件来组织和管理这个结构通常使用顶层 CMakeLists.txt 来标识。构建目录Build Tree指项目构建过程中生成的临时文件目录与源文件树Source Tree相对应。构建树包含编译过程中生成的中间文件如目标文件、依赖信息和最终产物如可执行文件、库文件通常使用 CMakeCache.txt 来标识。构建方式分类1. 源内构建在源代码树包含的顶级 CMakeLists.txt 的目录下进行直接构建cmake .cmake .这个命令就是在当前目录下直接构建项目也叫 “源内构建”。我们可以把它理解成“就在我现在站的这个文件夹里直接把代码编译成可执行文件。”坏处是编译过程中产生的临时文件、配置文件会和你的源代码混在一起时间长了文件夹会变得很乱想删干净都麻烦。2. 源外构建使用 - B 参数单独指定一个 build 目录在子目录里指定源文件目录包含 CMakeLists.txt 的目录cd build cmake ../推荐使用源外构建可维护一个纯净的源文件树避免中间文件污染源代码目录。cd build cmake ..这个命令是先进入build文件夹再告诉 CMake 去上一级目录找源代码来构建也叫 “源外构建”。我们可以理解成“我先专门建一个叫build的‘工地’所有编译产生的垃圾文件都放在这里源代码那边保持干干净净。”好处是源代码和编译产物彻底分开项目结构清爽。想重新编译的时候直接删掉build文件夹再重建就行非常方便。这是行业里最推荐的做法。我们使用上面的选项的话举例子对比一看就懂当前项目结构是这样my_project/ # 根目录放 CMakeLists.txt └── build/ # 空的构建目录老写法cd build # 先进入构建目录对应 -D build cmake .. # 告诉 CMake 源码在上级目录对应 -S ..新写法用-S和-Dcmake -S . -D build # -S . → 源码在当前目录my_project/ # -D build → 编译产物放到 build 文件夹里更完整的新写法加编译参数cmake -S . -D build -DCMAKE_BUILD_TYPERelease # 拆解 # -S . → 源码在当前目录 # -D build → 构建目录是 build 文件夹 # -DCMAKE_BUILD_TYPERelease → 编译模式为发布版这个 -D 是传参数和上面的 -D 目录是两回事❗ 关键提醒两个-D别搞混这是最容易懵的点我再强调一遍大写-D单独用比如-D build是-DCMAKE_BINARY_DIR的简写指定构建目录-D参数名值比如-DCMAKE_BUILD_TYPERelease是给 CMake 传自定义编译参数。简单记跟文件夹路径的-D→ 是指定构建目录跟键值对的-Dxxxxxx→ 是传编译参数。所以其实我们编写好对应的 CMakeLists.txt 文件之后只需要创建一个 build 的构建目录然后进入到构建目录中直接进行 cmake ../ 就可以了执行cmake ..后build 目录自动生成 4 个核心文件Makefile主构建文件make 命令的入口cmake_install.cmake安装专用脚本make install 和 cpack 共用CPackConfig.cmake打包配置文件cpack 命令读取CTestTestfile.cmake测试配置文件ctest 命令读取安装树Install Tree用于正式存放项目生成的二进制程序、静态库、动态库等产物以便于其他应用程序引用。GNUInstallDirs 里定义了各个系统下的默认安装路径Linux 下默认为prefix /usr/local CMAKE_INSTALL_PREFIX${prefix}2.3 编译链接cmake --build是 CMake 官方提供的跨平台统一编译命令作用是调用已生成的构建系统Makefile、VS 工程、Xcode 工程等完成代码的编译 链接最终生成可执行文件 / 库文件。cmake --build 构建目录 # 编译 CMake 生成的工程执行cmake ..后CMake 会根据CMakeLists.txt自动生成 Makefile 文件Linux/macOS 下cmake --build是通用编译入口它会自动识别当前平台调用对应的底层构建工具Linux/macOS → 自动调用makeWindows → 自动调用msbuildmake命令是 Linux 专属的直接编译命令直接读取构建目录下的Makefile执行编译与cmake --build功能完全一致。使用方法方式 1官方跨平台写法推荐全系统通用# 在项目根目录直接执行无需进入 build 文件夹 cmake --build build方式 2Linux/macOS 原生写法直接调用 make# 先进入构建目录 cd build # 直接执行 make 编译 make# 1. 创建并进入构建目录 mkdir build cd build # 2. CMake 配置生成 Makefile cmake .. # 3. 编译链接二选一即可 cmake --build . # 或者直接使用 make[ 25%] Building CXX object CMakeFiles/main.dir/main.cpp.o [ 50%] Linking CXX executable main [ 50%] Built target main [ 75%] Building CXX object CMakeFiles/testAdd.dir/test.cpp.o [100%] Linking CXX executable testAdd [100%] Built target testAdd二者完全等价cmake --build build跨平台cd build makeLinux 专属依赖文件编译的核心依据是cmake ..生成的Makefile最终产物在build目录下生成main、testAdd等可执行二进制文件最佳实践优先使用cmake --build保证 Windows/Linux/macOS 编译命令完全统一。2.4 测试ctest是 CMake 官方配套的测试执行工具专门用来运行项目中通过add_test定义的测试用例用于验证程序功能是否正常。命令格式ctest [options] # 在构建目录build下执行在CMakeLists.txt中写入include(CTest)和add_test后执行cmake ..配置时自动生成测试配置文件CTestTestfile.cmake自动在Makefile中添加test伪目标ctest是原生测试命令直接读取测试文件执行用例make test是简化封装命令底层本质就是调用ctest二者效果完全一致make test ↓ 执行 build/Makefile 里的 test 目标 ↓ 调用 /usr/bin/ctest ↓ ctest 读取 build/CTestTestfile.cmake ↓ CTestTestfile.cmake 来自 CMakeLists.txt 的 include(CTest) add_test() ↓ 运行测试程序 testAdd方式 1原生写法直接调用 ctest# 进入构建目录 cd build # 执行所有测试 ctest方式 2简化写法make 封装最常用# 进入构建目录 cd build # 执行测试底层自动调用 ctest make test跨平台统一写法# 无需进入 build直接指定目录执行测试 ctest --test-dir build# 1. 进入构建目录 cd build # 2. 执行测试二选一 ctest # 或者 make testTest project /home/bit/workspace/CMakeClass/cmake_tools/build Start 1: testAdd 1/1 Test #1: testAdd .......................... Passed 0.00 sec 100% tests passed, 0 tests failed out of 1 Total Test time (real) 0.00 sec测试功能必须在CMakeLists.txt中开启缺一不可# 开启 CTest 测试功能 include(CTest) # 定义测试用例 add_test(NAME Case_Add COMMAND testAdd)二者完全等价make testctest依赖文件执行依靠cmake ..生成的CTestTestfile.cmake执行时机必须先编译make生成测试程序才能执行测试核心作用自动化校验程序功能保证代码正确性2.5 安装cmake --install 是 CMake 官方配套的安装执行工具专门用来将项目编译生成的可执行文件、库文件等安装到系统指定目录。命令格式cmake --install dir # 在任意目录执行dir 为构建目录build在 CMakeLists.txt 中写入include(GNUInstallDirs)和install(TARGETS)后执行cmake ..配置时自动生成安装脚本文件cmake_install.cmake自动在 Makefile 中添加install伪目标cmake --install 是原生安装命令底层直接调用cmake_install.cmakemake install 是简化封装命令底层本质就是执行cmake -P cmake_install.cmake二者效果完全一致make install ↓ 执行 build/Makefile 里的 install 目标 ↓ 调用 /usr/local/bin/cmake -P cmake_install.cmake ↓ cmake_install.cmake 执行文件拷贝安装 ↓ cmake_install.cmake 来自 CMakeLists.txt 的 install(TARGETS) 配置 ↓ 将可执行文件安装到系统目录默认 /usr/local/bin方式 1原生写法直接调用 cmake --install# 在项目根目录直接执行指定构建目录 cmake --install build方式 2简化写法make 封装最常用# 进入构建目录 cd build # 执行安装底层自动调用 cmake_install.cmake make install跨平台统一写法# 无需进入 build直接指定目录安装 cmake --install build执行示例# 1. 进入构建目录 cd build # 2. 执行安装二选一 cmake --install . # 或者 make install示例输出[100%] Built target main Install the project... -- Install configuration: -- Installing: /usr/local/bin/main必备配置CMakeLists.txt 中include(GNUInstallDirs) install(TARGETS main) # 配置要安装的目标文件核心要点二者完全等价make install cmake --install .依赖文件执行依靠cmake ..生成的cmake_install.cmake执行时机必须先编译make生成目标程序才能执行安装核心作用将程序安装到系统目录方便全局使用lfzU22:~/WorkSpace/cmakeTest/cmake_tools/build$ sudo make install [ 50%] Built target main [100%] Built target testAdd Install the project... -- Install configuration: -- Up-to-date: /usr/local/bin/main lfzU22:~/WorkSpace/cmakeTest/cmake_tools/build$ main hello world! lfzU22:~/WorkSpace/cmakeTest/cmake_tools/build$ testAdd testAdd: command not found # 这是因为没有在 CMakeLists.txt 中写入到安装对象中 lfzU22:~/WorkSpace/cmakeTest/cmake_tools/build$ rm -rf /usr/bin/main lfzU22:~/WorkSpace/cmakeTest/cmake_tools/build$ ls /usr/bin/main ls: cannot access /usr/bin/main: No such file or directory2.6 打包cpack 是 CMake 官方配套的打包工具专门将已安装的程序文件打包成可分发的压缩包、安装包。命令格式cpack [options] # 在构建目录build下执行在 CMakeLists.txt 中写入include(CPack)后执行cmake ..配置时自动生成打包配置文件CPackConfig.cmake自动在 Makefile 中添加package伪目标cpack 是原生打包命令先临时安装文件再执行打包make package 是简化封装命令底层本质就是调用 cpack二者效果完全一致make package ↓ 执行 build/Makefile 里的 package 目标 ↓ 调用 /usr/bin/cpack ↓ cpack 读取 build/CPackConfig.cmake ↓ cpack 内部调用 cmake_install.cmake 临时安装文件 ↓ 将临时安装目录打包为 .sh/.tar.gz/.tar.Z 格式 ↓ 打包配置来自 CMakeLists.txt 的 include(CPack)方式 1原生写法直接调用 cpack# 进入构建目录 cd build # 执行打包 cpack方式 2简化写法make 封装最常用# 进入构建目录 cd build # 执行打包底层自动调用 cpack make package跨平台统一写法# 无需进入 build直接指定目录打包 cpack --config build/CPackConfig.cmake执行示例# 1. 进入构建目录 cd build # 2. 执行打包二选一 cpack # 或者 make package示例输出CPack: Create package using STGZ CPack: Install projects CPack: - Run preinstall target for: helloWorld CPack: - Install project: helloWorld [] CPack: Create package CPack: - package: /home/xxx/cmake_tools/build/helloWorld-0.1.1-Linux.sh generated. CPack: Create package using TGZ CPack: - package: /home/xxx/cmake_tools/build/helloWorld-0.1.1-Linux.tar.gz generated. CPack: Create package using TZ CPack: - package: /home/xxx/cmake_tools/build/helloWorld-0.1.1-Linux.tar.Z generated.必备配置CMakeLists.txt 中include(CPack) # 开启打包功能自动继承 install 配置核心要点二者完全等价make package cpack依赖文件依靠CPackConfig.cmake cmake_install.cmake执行时机必须先配置 编译才能执行打包核心作用生成可直接分发、安装的软件包2.7 脚本模式cmake -P 是 CMake 的脚本执行模式专门用于执行纯 CMake 脚本不生成构建系统、不编译代码。命令格式cmake -P file # 执行指定的 CMake 脚本文件功能说明CMake 脚本模式不会生成 Makefile、不编译代码、不生成目标文件。专门用于文件处理、目录创建、文件拷贝、权限设置、安装部署等纯脚本任务。核心调用链路cmake -P cmake_install.cmake ↓ 执行 cmake_install.cmake 中的安装脚本逻辑 ↓ 完成文件拷贝、目录创建、安装操作示例说明make install 底层真正执行的就是该命令在 Makefile 中代码如下# Special rule for the target install install: preinstall $(CMAKE_COMMAND) -E cmake_echo_color --switch$(COLOR) --cyan Install the project... /usr/local/bin/cmake -P cmake_install.cmake .PHONY : install核心作用make install 的底层实现通过 cmake -P 执行安装脚本是连接 Makefile 与安装逻辑的核心桥梁所有安装行为都由该脚本模式完成2.8 调用外部命令cmake -E 是 CMake 的外部命令调用模式提供跨平台兼容的系统命令封装。命令格式cmake -E command # 跨平台执行系统命令功能说明不依赖系统原生命令rm/mkdir/cpCMake 提供统一跨平台实现。保证 Windows/Linux/macOS 命令行为完全一致。核心示例Makefile 内# The command to remove a file. RM /usr/bin/cmake -E rm -f执行逻辑cmake -E rm -f 文件 ↓ 跨平台删除指定文件 ↓ 替代系统原生 rm 命令避免平台兼容问题常用命令cmake -E rm -f删除文件cmake -E mkdir创建目录cmake -E cp拷贝文件核心作用提供跨平台一致的系统操作能力Makefile 大量依赖该模式2.9 查看帮助cmake --help 是 CMake 官方帮助查看工具用于查询所有命令、参数、用法说明。命令格式cmake --help输出内容完整说明包含命令格式-S /-B/-D /-P/-E 所有参数说明模块、变量、命令详解构建、安装、测试、打包相关说明Usagecmake [options] path-to-source cmake [options] path-to-existing-build cmake [options] -S path-to-source -B path-to-buildOptions 节选-S path-to-source 指定源码目录 -B path-to-build 指定构建目录 -D varvalue 定义缓存变量 -P file 执行脚本模式 -E command 执行外部命令模式 --build dir 编译构建 --install dir 安装项目核心作用快速查询所有 CMake 命令、参数、功能用法是学习与调试的核心工具