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

cmake的一点点初步使用

cmake的一点点初步使用   https://cmake.org/

-------------

 

cmake打包程序。

1.开源跨平台

2.构建build,测试test,打包软件package sofrware的工具软件.

3.cmake的配置文件简单易懂,不依赖于其他平台的编译器

4.使用cmake配置文件来控制软件的编译过程,生成器generator生成指定项目文件(native makefile,MinGW Makefiles,Ninja,Visual Studio)等等的workspaces。

通过,对应的编译软件,最终编译成目标程序。

cmake命令,在那个目录下执行,就会搜索CMakeLists.txt,并在当前目录下生成相关文件(如果在代码目录执行,会在代码文件目录,会污染代码目录)。

所以一般是,建立build目录,和bin目录,在build目录中执行cmake ..(在上一级目录找CMakeLists.txt), build目录生成处理文件,最终可执行文件在bin中

 一 ,简单的cmake

  1 先看下目录结构 (-I表示忽略的目录)

$  tree . -I "bin|build|lib|src"
.
|-- CMakeLists.txt
|-- fun1.c
|-- fun2.c
|-- include
|   |-- fun1.h
|   `-- fun2.h
`-- test01.c1 directory, 6 files

 

# 指定 CMake 的最低版本要求
cmake_minimum_required(VERSION 3.10.0)#定义项目的名称和使用的编程语言
project(code1 VERSION 0.1.0 LANGUAGES C)#指定要生成的可执行文件和其源文件
add_executable(code1 test01.c fun1.c fun2.c)

  如果文件夹有很多源码文件总不能一个一个添加吧,这里用到 aux_source_directory(. SRC_LIST)

# 指定 CMake 的最低版本要求
cmake_minimum_required(VERSION 3.10.0)#定义项目的名称和使用的编程语言
project(code1 VERSION 0.1.0 LANGUAGES C)#将当前目录.的所有源码文件保存在SRC_LIST变量中
aux_source_directory(. SRC_LIST)#指定要生成的可执行文件和其源文件
add_executable(code1 ${SRC_LIST})

 

  2 最后在build目录下执行 cmake ..

二 , cmake正规的组织结构

$  tree . 
.
|-- CMakeLists.txt
|-- bin
|-- build
|-- include
|   |-- fun1.h
|   `-- fun2.h
|-- lib
`-- src|-- fun1.c|-- fun2.c`-- test01.c5 directories, 6 files

 

# 指定 CMake 的最低版本要求
cmake_minimum_required(VERSION 3.10.0)#定义项目的名称和使用的编程语言
project(code1 VERSION 0.1.0 LANGUAGES C)# bin目录下将来存最终生成的可执行文件
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#将当前目录.的src所有源码文件保存在SRC_LIST变量中
aux_source_directory(src SRC_LIST)# 指定头文件目录include
include_directories(include)#指定要生成的可执行文件和其源文件
add_executable(code1 ${SRC_LIST})

 

这里介绍几个cmake的变量, EXECUTABLE_OUTPUT_PATH :可执行文件生成路径;PROJECT_SOURCE_DIR :项目的路径。

set()设置变量;include_directories()设置头文件目录;aux_source_directory()设置源码路径。


三, cmake处理编译动态库静态库 

1.创建并处理自制动态库windows下(多个CMakeLists.txt 子工程)

 项目结构(推荐) 这种结构清晰、可扩展,适合中小型到大型项目。

MyProject/
├── CMakeLists.txt              # 根 CMake
├── MathLib/                    # 动态库模块
│   ├── CMakeLists.txt
│   ├── include/MathLib.h
│   └── src/MathLib.cpp
└── MyApp/                      # 主程序├── CMakeLists.txt└── main.cpp

 第一步:编写动态库代码   

MathLib/include/MathLib.h

#pragma once// 跨平台导出宏(Windows 专用)
#ifdef _WIN32#ifdef MATHLIB_BUILDING#define MATHLIB_API __declspec(dllexport)#else#define MATHLIB_API __declspec(dllimport)#endif
#else#define MATHLIB_API
#endifnamespace Math {MATHLIB_API int add(int a, int b);MATHLIB_API int subtract(int a, int b);
}

MathLib/src/MathLib.cpp

#include "MathLib.h"namespace Math {int add(int a, int b) { return a + b; }int subtract(int a, int b) { return a - b; }
}

第二步:MathLib/CMakeLists.txt(构建 DLL)

# 创建动态库
add_library(MathLib SHAREDsrc/MathLib.cpp
)# 设置公共头文件路径(供 MyApp 使用)
target_include_directories(MathLibPUBLIC$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>$<INSTALL_INTERFACE:include>
)# 关键:定义宏,让头文件知道当前是“构建 DLL”
target_compile_definitions(MathLib PRIVATE MATHLIB_BUILDING)# 可选:统一输出目录(更整洁)
set_target_properties(MathLib PROPERTIESRUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/binLIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/libARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
)

PUBLIC 表示:任何链接 MathLib 的目标,都会自动获得 include/ 路径。

第三步:主程序代码

MyApp/main.cpp

#include <iostream>
#include "MathLib.h"  // 来自 MathLib/include/int main() {std::cout << "10 + 5 = " << Math::add(10, 5) << "\n";std::cout << "10 - 3 = " << Math::subtract(10, 3) << "\n";return 0;
}

第四步:MyApp/CMakeLists.txt(引用 DLL)

# 创建可执行程序
add_executable(MyApp main.cpp)# 链接动态库(直接写目标名!CMake 自动处理 .lib 路径)
target_link_libraries(MyApp PRIVATE MathLib)# 👇 关键:Windows 下自动复制 .dll 到 .exe 目录
if(WIN32)add_custom_command(TARGET MyApp POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy_if_different$<TARGET_FILE:MathLib>          # 源:MathLib.dll$<TARGET_FILE_DIR:MyApp>        # 目标:MyApp.exe 所在目录COMMENT "Copying MathLib.dll to MyApp directory")
endif()

$<TARGET_FILE:MathLib> 会自动解析为 Debug/MathLib.dllRelease/MathLib.dll,完全匹配当前配置!

第五步:根 CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(MyProject LANGUAGES CXX)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 添加子模块
add_subdirectory(MathLib)
add_subdirectory(MyApp)

构建步骤(VS2022 + CMake)

方法一:用命令行(推荐)

# 在 MyProject 目录下
mkdir build
cd build# 生成 VS2022 项目(x64)
cmake .. -G "Visual Studio 17 2022" -A x64# 构建 Release 版本
cmake --build . --config Release# 运行(自动找到 DLL!)
.\Release\MyApp.exe

方法二:用 VS2022 IDE

  1. 打开 VS2022 → 文件 → 打开 → CMake... → 选择 MyProject/CMakeLists.txt
  2. VS 会自动加载项目
  3. 顶部选择 x64-Release
  4. 右键 MyApp → 设为启动项
  5. 按 F5 运行!
10 + 5 = 15
10 - 3 = 7

 构建后目录结构(build/ 下)

build/
├── bin/
│   └── Release/
│       ├── MathLib.dll      ← 动态库
│       └── MyApp.exe        ← 可执行文件(同目录,运行无忧)
├── lib/
│   └── Release/
│       └── MathLib.lib      ← 导入库(链接时用)
└── MyProject.sln            ← VS 解决方案

💡 因为用了 add_custom_command,运行时绝不会报“找不到 MathLib.dll”!

2.使用链接器默认目录下的动态库

 

3.使用指定目录下的动态库

 

 

 

 

 

四,cmake 综合处理上面的情况

 

 

https://blog.csdn.net/hhltaishuai/article/details/123795718

https://www.runoob.com/cmake/cmake-basic.html

扩展:cake

https://www.bilibili.com/video/BV1nw411C71Z

https://www.bilibili.com/video/BV1EuWKevE23

gcc编译:

https://www.bilibili.com/video/BV192pZeTE9B

 

使用CMake生成动态链接库(.dll和.so)和静态链接库(.lib和.a)的方法

https://blog.csdn.net/weixin_43325228/article/details/143139745

 

http://www.rkmt.cn/news/87839.html

相关文章:

  • 终极指南:5分钟快速部署IoTSharp物联网平台
  • 微服务架构设计 - 可降级设计
  • 基于Web的客户关系管理系统的设计与实现开题报告
  • 项目分享|AP2:让智能体学会安全支付的开源标准
  • ENVI Classic遥感影像处理终极指南:从入门到精通快速上手
  • 第十二周周报 郭安迪
  • 如何平衡服务器内存使用率和系统稳定性?
  • 2025最新!上海宣传册设计公司TOP5实力榜:上海申佑美荣登榜首 - 真知灼见33
  • 因为熬过了PMP,浅浅说一下他的强度!
  • 北京律师指南2025-2026:金牌律师 / 法律顾问机构排行榜测评 —— 在线法律问题咨询方案、专业能力与口碑排名的全面公正解析 - 苏木2025
  • 项目分享 | GLaDOS Personality Core:开源软硬件项目,将游戏AI角色带入现实
  • 2025年12月钢骨架聚乙烯管怎么选?厂家哪家好?哪家强?这份推荐榜TOP清单给你答案! - 品牌推荐用户报道者
  • 2025年聚焦中频熔炼炉厂家:兼顾工艺与适配性的实力厂家推荐 - 深度智识库
  • 【Nordic随笔】nRF54L系列新成员:nRF54LV10
  • 终极指南:免费在Mac上读写NTFS磁盘的简单方法
  • ModernWMS开源仓库管理系统终极配置与功能详解
  • 2025年南京十大公考培训机构推荐:中政公考的教学方法有效吗 - 工业品牌热点
  • 实力推荐!程控阀源头厂家TOP5,重庆嘉凯捷登顶 - 百誉集团
  • 实用指南:DAM系统用户培训体系设计与实施要点
  • 哔哩哔哩漫画下载器技术指南
  • 极简C++项目工程脚手架:一键生成CMake + Neovim LSP环境(Mac/Linux and Windows)
  • 2025年度油加工在线分析检测厂家、饲料分析检测供应企业推荐 - mypinpai
  • AI学习机品牌排名Top5:实用推荐不容错过! - 百誉集团
  • 八中上机课练习题单
  • 工作后如何进行持续学习
  • 水土保持方案编制实操与典型案例分析技术应用
  • 企业合规必备|2025 算法备案实操指南:避坑要点 + 未合规风险
  • 2025年中国五大恒温酒窖设计公司推荐:求推荐酒窖设计专业公 - mypinpai
  • 口碑好的仪表品牌推荐排行?仪表品牌 仪表公司 仪表工厂 仪表厂家 仪表厂商 仪表生产厂家
  • 2025反应釜按需定制TOP5实力厂商推荐:甄选品牌厂家助力 - myqiye