news 2026/6/15 20:28:36

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/15 10:27:57

PaddlePaddle生态全景图:从模型到GPU部署的一站式解决方案

PaddlePaddle生态全景图&#xff1a;从模型到GPU部署的一站式解决方案 在人工智能技术加速渗透各行各业的今天&#xff0c;一个现实问题始终困扰着开发者和企业&#xff1a;如何将前沿算法高效、稳定地落地到真实业务场景中&#xff1f;尤其是在中文语境下&#xff0c;面对工业…

作者头像 李华
网站建设 2026/6/15 10:29:53

ZyPlayer视频播放器完全配置手册:从入门到精通

ZyPlayer视频播放器完全配置手册&#xff1a;从入门到精通 【免费下载链接】ZyPlayer 跨平台桌面端视频资源播放器,免费高颜值. 项目地址: https://gitcode.com/gh_mirrors/zy/ZyPlayer 想要体验一款免费、高颜值且功能强大的跨平台视频播放器吗&#xff1f;ZyPlayer就是…

作者头像 李华
网站建设 2026/6/15 10:25:44

终极SVG提取工具:SVG Crowbar高效使用指南

终极SVG提取工具&#xff1a;SVG Crowbar高效使用指南 【免费下载链接】svg-crowbar Extracts an SVG node and accompanying styles from an HTML document and allows you to download it all as an SVG file. 项目地址: https://gitcode.com/gh_mirrors/sv/svg-crowbar …

作者头像 李华
网站建设 2026/6/15 10:28:08

5步快速上手:用HarukaBot实现B站UP主动态实时推送到QQ群

5步快速上手&#xff1a;用HarukaBot实现B站UP主动态实时推送到QQ群 【免费下载链接】HarukaBot 将 B 站的动态和直播信息推送至 QQ&#xff0c;基于 NoneBot2 开发 项目地址: https://gitcode.com/gh_mirrors/ha/HarukaBot 还在为错过心爱UP主的精彩直播和最新动态而烦…

作者头像 李华
网站建设 2026/6/15 10:23:17

OpenMMD终极指南:三步将真人动作转换为专业3D动画

OpenMMD终极指南&#xff1a;三步将真人动作转换为专业3D动画 【免费下载链接】OpenMMD OpenMMD is an OpenPose-based application that can convert real-person videos to the motion files (.vmd) which directly implement the 3D model (e.g. Miku, Anmicius) animated m…

作者头像 李华
网站建设 2026/6/15 10:27:56

BasicTS终极指南:一站式时间序列预测解决方案

BasicTS终极指南&#xff1a;一站式时间序列预测解决方案 【免费下载链接】BasicTS 项目地址: https://gitcode.com/gh_mirrors/ba/BasicTS BasicTS是一个功能强大的开源时间序列预测框架&#xff0c;为研究人员和开发者提供了一站式的解决方案。无论你是从事时间序列预…

作者头像 李华