news 2026/4/28 2:37:04

CMake 构建实例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CMake 构建实例

CMake 构建实例:从简单到复杂实战项目

下面通过4个逐步升级的实际项目实例,展示 CMake 的完整构建流程、目录结构和CMakeLists.txt编写。所有实例都遵循现代 CMake 最佳实践(CMake 3.15+,target-centric 写法,源码外构建)。

实例1:单文件 Hello World(最简单入门)

目录结构

hello/ ├── CMakeLists.txt └── main.cpp

main.cpp

#include<iostream>intmain(){std::cout<<"Hello, CMake World!"<<std::endl;return0;}

CMakeLists.txt

cmake_minimum_required(VERSION 3.15) project(HelloWorld LANGUAGES CXX) add_executable(${PROJECT_NAME} main.cpp) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)

构建命令

mkdirbuild&&cdbuild cmake..-DCMAKE_BUILD_TYPE=Release cmake --build../HelloWorld
实例2:多文件 + 头文件目录(典型小型项目)

目录结构

math_app/ ├── CMakeLists.txt ├── main.cpp ├── include/ │ └── math_utils.h └── src/ └── math_utils.cpp

math_utils.h

#pragmaoncedoubleadd(doublea,doubleb);doublemultiply(doublea,doubleb);

math_utils.cpp

#include"math_utils.h"doubleadd(doublea,doubleb){returna+b;}doublemultiply(doublea,doubleb){returna*b;}

main.cpp

#include<iostream>#include"math_utils.h"intmain(){std::cout<<"3 + 5 = "<<add(3,5)<<std::endl;std::cout<<"4 * 7 = "<<multiply(4,7)<<std::endl;}

CMakeLists.txt

cmake_minimum_required(VERSION 3.15) project(MathApp LANGUAGES CXX) add_executable(${PROJECT_NAME} main.cpp src/math_utils.cpp ) target_include_directories(${PROJECT_NAME} PRIVATE include) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)

构建同上

实例3:分离库 + 多目录(中型项目推荐结构)

目录结构

calculator/ ├── CMakeLists.txt # 根目录 ├── app/ │ ├── CMakeLists.txt │ └── main.cpp ├── lib/ │ ├── CMakeLists.txt │ ├── include/calculator/ │ │ └── core.h │ └── src/ │ └── core.cpp └── tests/ # (可选,后续加测试)

lib/include/calculator/core.h

#pragmaoncenamespacecalc{doubleadd(doublea,doubleb);doublesubtract(doublea,doubleb);}

lib/src/core.cpp

#include"calculator/core.h"namespacecalc{doubleadd(doublea,doubleb){returna+b;}doublesubtract(doublea,doubleb){returna-b;}}

app/main.cpp

#include<iostream>#include"calculator/core.h"intmain(){std::cout<<"10 - 4 = "<<calc::subtract(10,4)<<std::endl;return0;}

lib/CMakeLists.txt(库)

add_library(calc_core STATIC src/core.cpp ) target_include_directories(calc_core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) target_compile_features(calc_core PUBLIC cxx_std_17)

app/CMakeLists.txt(可执行)

add_executable(calculator_app main.cpp) target_link_libraries(calculator_app PRIVATE calc_core)

根 CMakeLists.txt

cmake_minimum_required(VERSION 3.15) project(Calculator LANGUAGES CXX) add_subdirectory(lib) add_subdirectory(app)

构建命令

mkdirbuild&&cdbuild cmake..-DCMAKE_BUILD_TYPE=Release cmake --build../app/calculator_app
实例4:完整项目(带静态/动态库选项 + 安装规则 + 测试)

扩展实例3,添加:

  • 可选生成共享库
  • 安装规则(make install
  • 简单单元测试

根 CMakeLists.txt(增强版)

cmake_minimum_required(VERSION 3.15) project(Calculator LANGUAGES CXX) # 选项:是否构建共享库(默认静态) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) add_subdirectory(lib) add_subdirectory(app) add_subdirectory(tests) # 可选 # 安装规则 install(TARGETS calculator_app DESTINATION bin ) install(TARGETS calc_core DESTINATION lib ) install(DIRECTORY lib/include/ DESTINATION include )

tests/CMakeLists.txt(使用 CMake 自带测试)

find_package(GTest QUIET) if(GTest_FOUND) add_executable(calc_test test_core.cpp) target_link_libraries(calc_test PRIVATE calc_core GTest::gtest_main) add_test(NAME CalcTest COMMAND calc_test) else() message(WARNING "Google Test not found, skipping tests") endif()

构建 + 安装 + 测试

mkdirbuild&&cdbuild cmake..-DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON cmake --build.ctest.# 运行测试(如果有 GTest)sudocmake --install.--prefix /usr/local# 安装到系统
总结:推荐项目模板(直接复制使用)
myproject/ ├── CMakeLists.txt ├── cmake/ # 可选:自定义模块 ├── app/ │ ├── CMakeLists.txt │ └── main.cpp ├── lib/ │ ├── CMakeLists.txt │ ├── include/myproject/ │ └── src/ ├── tests/ │ └── CMakeLists.txt └── third_party/ # 第三方库(如 vcpkg/conan 管理)

这些实例覆盖了从单文件到中大型项目的全部常见需求。你可以直接复制修改使用。

如果你想看特定场景的实例(如集成 Boost/Qt/OpenCV、交叉编译 Android/iOS、使用 vcpkg/Conan 包管理、生成 deb/rpm 包等),告诉我,我立刻给出完整可运行的例子!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 23:12:31

AI数独终极指南:照片秒变数独答案的智能解题神器

AI数独终极指南&#xff1a;照片秒变数独答案的智能解题神器 【免费下载链接】AI_Sudoku GUI based Smart Sudoku Solver that tries to extract a sudoku puzzle from a photo and solve it 项目地址: https://gitcode.com/gh_mirrors/ai/AI_Sudoku 还在为复杂的数独题…

作者头像 李华
网站建设 2026/4/18 5:34:01

21、应用设置与用户管理功能实现

应用设置与用户管理功能实现 在应用开发中,设置与用户管理功能是提升用户体验的重要部分。下面将详细介绍如何实现用户注销、设置用户头像以及获取用户账户额外信息等功能。 1. 用户注销功能实现 用户注销是设置选项卡的主要功能之一。为了实现该功能,需要完成以下几个步骤…

作者头像 李华
网站建设 2026/4/24 10:32:50

图解说明AXI DMA在SoC中的连接方式

深入理解AXI DMA&#xff1a;从原理到SoC系统中的实战连接你有没有遇到过这样的场景&#xff1f;CPU明明没做什么复杂计算&#xff0c;系统却卡得不行。查看负载发现&#xff0c;数据搬运占了大头——比如摄像头源源不断地送帧进来&#xff0c;网络包一个接一个地收&#xff0c…

作者头像 李华
网站建设 2026/4/26 18:57:59

trace.moe技术深度解析:如何实现秒级动漫场景精准搜索

trace.moe技术深度解析&#xff1a;如何实现秒级动漫场景精准搜索 【免费下载链接】trace.moe trace.moe - 一个动漫场景搜索引擎&#xff0c;能够识别动漫截图中的场景并提供具体出自哪一集的信息。 项目地址: https://gitcode.com/gh_mirrors/tr/trace.moe 在动漫爱好…

作者头像 李华
网站建设 2026/4/23 4:35:31

STM32离线烧写器实战指南:告别电脑束缚的终极烧写方案

STM32离线烧写器实战指南&#xff1a;告别电脑束缚的终极烧写方案 【免费下载链接】OfflineSWD STM32系列离线烧写器 项目地址: https://gitcode.com/gh_mirrors/of/OfflineSWD 在嵌入式开发的世界里&#xff0c;你是否曾因现场无法连接电脑而束手无策&#xff1f;是否在…

作者头像 李华
网站建设 2026/4/25 3:26:03

One Dark Pro主题完全指南:打造专业级VS Code编码环境

One Dark Pro主题完全指南&#xff1a;打造专业级VS Code编码环境 【免费下载链接】OneDark-Pro Atoms iconic One Dark theme for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/on/OneDark-Pro 还在为代码编辑器单调的配色而苦恼吗&#xff1f;每天面…

作者头像 李华