news 2026/6/3 1:52:48

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/6/1 13:39:53

PaddlePaddle镜像支持Jupyter Notebook在线编程环境

PaddlePaddle镜像集成Jupyter Notebook&#xff1a;重塑AI开发体验 在深度学习项目中&#xff0c;最让人头疼的往往不是模型设计本身&#xff0c;而是环境配置——“为什么你的代码在我机器上跑不起来&#xff1f;”这种对话几乎成了每个AI工程师的日常。依赖冲突、版本错配、…

作者头像 李华
网站建设 2026/5/29 14:28:01

4步快速出图!Qwen-Image-Edit-Rapid-AIO v5重构AI图像编辑效率

Qwen-Image-Edit-Rapid-AIO v5是阿里巴巴通义千问团队推出的专业级AI图像编辑模型&#xff0c;通过融合优化技术和多模态组件&#xff0c;实现了仅需4步推理即可完成高质量图像编辑&#xff0c;将传统编辑流程效率提升8倍&#xff0c;重新定义了AI辅助设计的工作标准。 【免费下…

作者头像 李华
网站建设 2026/5/22 1:08:02

mui框架用户反馈终极指南:打造完美应用体验的完整教程

mui框架用户反馈终极指南&#xff1a;打造完美应用体验的完整教程 【免费下载链接】mui 最接近原生APP体验的高性能框架 项目地址: https://gitcode.com/gh_mirrors/mu/mui 在移动应用竞争日益激烈的今天&#xff0c;用户反馈成为连接开发者与用户需求的关键桥梁。mui框…

作者头像 李华
网站建设 2026/5/20 13:21:19

数字人跨平台开发创新方案:重新定义多端部署架构

数字人跨平台开发创新方案&#xff1a;重新定义多端部署架构 【免费下载链接】duix.ai 项目地址: https://gitcode.com/GitHub_Trending/du/duix.ai 技术演进背景&#xff1a;数字人部署的挑战与机遇 在人工智能技术快速发展的当下&#xff0c;数字人技术正从单一平台…

作者头像 李华
网站建设 2026/5/30 18:52:35

ESP异常解码器终极指南:快速定位和修复ESP32崩溃问题

ESP异常解码器终极指南&#xff1a;快速定位和修复ESP32崩溃问题 【免费下载链接】EspExceptionDecoder Exception Stack Trace Decoder for ESP8266 and ESP32 项目地址: https://gitcode.com/gh_mirrors/es/EspExceptionDecoder 开发痛点&#xff1a;为什么你的ESP32项…

作者头像 李华