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

CMake的使用

CMake是跨平台工具,一般我们拉下来一个项目,编译的时候都是用CMake,具体是CMakeList这样的一个脚本文件,具体如何编写这个脚本文件
1、cmake_minimum_required(VERSION 3.10)---这是指定CMake软件的最低版本(要在电脑上装一个CMake工具,在中断输入 cmake --version查看版本)
2、project(A VERSION 1.0 LANGUAGES CXX)---这是指定编译后生成的项目名称为A,版本是1.0(这个随意),使用的语言为CXX,也就是C++
3、add_subdirectory(src/3rdparty/libmodbus)---这里是指定CMake去src/3rdparty/libmodbus目录下执行对应的CMakeList脚本文件,在我的例子项目中,是把modbus的源文件放在了src/3rdparty/libmodbus目录下,然后CMake单独编译这个库,之后链接到主程序中;当然我们也可以用vcpkg远程把modbus库拉下来,然后链接到主程序
image
4、add_executable(B ${SRC})---这个是生成可执行文件的意思,执行后生成可执行文件B,而${SRC}是我们自定义的一个文件夹,其中会包含我们的所有程序源文件,头文件,当项目文件多的时候总不能这样写,add_executable(B a.cpp,b.cpp,c.cpp……),这样写文件太多了不好管理,所以把这些源文件都定义为一个SRC文件夹

点击查看代码
set(SRCmain.cppsrc/logging/logger.cppsrc/config/config.cppsrc/config/config_watcher.cppsrc/modbus/modbus_types.cppsrc/modbus/modbus_tcp_client.cppsrc/modbus/modbus_session.cpp
)
5、指定使用的C++标准 set(CMAKE_CXX_STANDARD 17)---指定使用C++17 set(CMAKE_CXX_STANDARD_REQUIRED ON)---强制编译器支持C++标准,不支持会报错 set(CMAKE_AUTOMOC ON)---自动处理Q_OBJECT 宏,set(CMAKE_AUTORCC ON)---自动处理 RCC(.qrc 资源文件)

6、对于如何指定第三方库的include和lib文件,这里是用的vcpkg先把对应的库拉取下来
对不同的系统进行区分,WIN32就是Windows系统,APPLE就是moc系统,UNIX就是linux系统,不同系统下vcpkg的位置是不一样的
以Windows为例,我们把FFMPEG_ROOT 设置为默认的vcpkg目录路径,我这里写明了我电脑上的目录,使用别人的项目时这里要改成你自己电脑上的vcpkg位置
include_directories是指定include文件夹的位置,link_directories是指定lib文件夹的位置,让程序能找到他们

点击查看代码
if (WIN32)set(FFMPEG_ROOT "D:/vcpkg/vcpkg/installed/x64-windows")
elseif (APPLE)set(FFMPEG_ROOT "$ENV{HOME}/lib/vcpkg/installed/arm64-osx")
# 可选:增加 Linux 分支
elseif (UNIX)set(FFMPEG_ROOT "$ENV{HOME}/vcpkg/installed/x64-linux")
endif()# 2. 指定 FFmpeg 头文件目录
include_directories("${FFMPEG_ROOT}/include")
# 3. 指定 FFmpeg 库文件目录
link_directories("${FFMPEG_ROOT}/lib")
7、当你设置好vcpkg的路径,指定好include和lib的目录后就需要从这些目录中找到具体需要的.lib文件 这里包括之前的例子都是用的ffmpeg库的例子,set FFMPEG_LIBS作为ffmpeg需要的.lib文件 而set(CMAKE_POSITION_INDEPENDENT_CODE ON)---让静态库的代码能被动态加载,适配 macOS 的编译规则
点击查看代码
if (WIN32)set(FFMPEG_LIBSavcodecavdeviceavfilteravformatavutilswresampleswscale)
elseif (APPLE)set(FFMPEG_LIBS${FFMPEG_ROOT}/lib/libavcodec.a${FFMPEG_ROOT}/lib/libavdevice.a${FFMPEG_ROOT}/lib/libavfilter.a${FFMPEG_ROOT}/lib/libavformat.a${FFMPEG_ROOT}/lib/libavutil.a${FFMPEG_ROOT}/lib/libswresample.a${FFMPEG_ROOT}/lib/libswscale.a)set(CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()
8、更加明确的指定程序找到头文件--target_include_directories命令 之前的"6"中有类似的命令--include_directories,这个命令就是指定全局都能找到这个目录下的头文件(只不过这个命令用于了vcpkg的头文件目录搜寻) 而target_include_directories这个命令更加灵活,比如它指定了只有AquaRegulator 这个可执行程序能访问对应的头文件 src ${CMAKE_CURRENT_SOURCE_DIR}分别表示从src目录和当前CMakeList.txt的所属目录下去寻找对应的头文件
点击查看代码
target_include_directories(AquaRegulator PRIVATE src ${CMAKE_CURRENT_SOURCE_DIR})
9、同样让指定可执行程序链接到对应的.lib文件也是,这里就不做说明了
点击查看代码
target_link_libraries(AquaRegulator PRIVATEQt${QT_VERSION_MAJOR}::Core       # Qt 核心库(动态适配 Qt5/Qt6)Qt${QT_VERSION_MAJOR}::Network    # Qt 网络库Qt${QT_VERSION_MAJOR}::Concurrent # Qt 并发库Qt${QT_VERSION_MAJOR}::Quick      # Qt Quick 库Qt${QT_VERSION_MAJOR}::Widgets    # Qt 窗口组件库Qt${QT_VERSION_MAJOR}::Sql        # Qt 数据库库${FFMPEG_LIBS}                    # 之前定义的 FFmpeg 库列表(跨平台)modbus                            # modbus 库(vcpkg 安装的/系统的)
)
10、检查Qt中的版本和要使用的模块是否能用,按需求加入或删除模块就行 第一行是检测QT6或QT5是否能用 第二行检测core,networks等是否能用
点击查看代码
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Network Concurrent Quick Widgets Sql)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network Concurrent Quick Widgets Sql)
11、安装可执行程序AquaRegulator
点击查看代码
install(TARGETS AquaRegulatorRUNTIME DESTINATION bin
)整体的代码
<details>
<summary>点击查看代码</summary>

cmake_minimum_required(VERSION 3.16)

project(AquaRegulator VERSION 1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Network Concurrent Quick Widgets Sql)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network Concurrent Quick Widgets Sql)

add_subdirectory(src/3rdparty/libmodbus)

if (WIN32)
set(FFMPEG_ROOT "D:/vcpkg/vcpkg/installed/x64-windows")
elseif (APPLE)
set(FFMPEG_ROOT "$ENV{HOME}/lib/vcpkg/installed/arm64-osx")
endif()

include_directories("${FFMPEG_ROOT}/include")
link_directories("${FFMPEG_ROOT}/lib")

if (WIN32)
set(FFMPEG_LIBS
avcodec
avdevice
avfilter
avformat
avutil
swresample
swscale
)
elseif (APPLE)
set(FFMPEG_LIBS
${FFMPEG_ROOT}/lib/libavcodec.a
${FFMPEG_ROOT}/lib/libavdevice.a
${FFMPEG_ROOT}/lib/libavfilter.a
${FFMPEG_ROOT}/lib/libavformat.a
${FFMPEG_ROOT}/lib/libavutil.a
${FFMPEG_ROOT}/lib/libswresample.a
${FFMPEG_ROOT}/lib/libswscale.a
)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()

set(SRC
main.cpp
src/logging/logger.cpp
src/config/config.cpp
src/config/config_watcher.cpp
src/modbus/modbus_types.cpp
src/modbus/modbus_tcp_client.cpp
src/modbus/modbus_session.cpp
src/device/device_driver.h
src/device/modbus_device_driver.h
src/device/simple_register_device.cpp
src/device/simple_register_device.h
src/device/temperature_device.cpp
src/device/temperature_device.h
src/device/humidity_device.cpp
src/device/humidity_device.h
src/device/light_device.cpp
src/device/light_device.h
src/scheduler/polling_scheduler.cpp
src/scheduler/polling_scheduler.h
src/scheduler/polling_task.h
src/data/data_cache.cpp
src/data/data_cache.h
src/data/file_data_repository.cpp
src/data/file_data_repository.h
src/data/data_repository.h
src/data/sqlite_data_repository.cpp
src/data/sqlite_data_repository.h
src/diagnostics/health_monitor.cpp
src/diagnostics/health_monitor.h
src/diagnostics/diagnostics_reporter.cpp
src/diagnostics/diagnostics_reporter.h
src/metrics/metrics_collector.cpp
src/metrics/metrics_collector.h
src/api/service_facade.cpp
src/api/service_facade.h
src/api/telemetry_api.cpp
src/api/telemetry_api.h
src/api/command_server.cpp
src/api/command_server.h
src/rules/rule.h
src/rules/threshold_rule.cpp
src/rules/threshold_rule.h
src/rules/rate_change_rule.cpp
src/rules/rate_change_rule.h
src/rules/rule_engine.cpp
src/rules/rule_engine.h
src/simulator/modbus_simulator.cpp
src/simulator/modbus_simulator.h
sensordata.cpp
sensordata.h
quick_video_image.hpp
player.cpp
player.h
lighting_item.cpp
lighting_item.h
qml.qrc
img.qrc
)

add_executable(AquaRegulator ${SRC})

target_include_directories(AquaRegulator PRIVATE src ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(AquaRegulator PRIVATE
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Concurrent
Qt${QT_VERSION_MAJOR}::Quick
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::Sql
${FFMPEG_LIBS}
modbus
)

install(TARGETS AquaRegulator
RUNTIME DESTINATION bin
)

</details>
http://www.jsqmd.com/news/406541/

相关文章:

  • R语言中的长字符串处理:无函数拼接技巧
  • nlp_gte_sentence-embedding_chinese-large模型版本管理与升级策略
  • FRCRN语音降噪效果展示:保留口音特征的方言语音高质量还原
  • 3步搞定!用Ollama部署granite-4.0-h-350m实现代码补全
  • 避免重复上传:Shapefile的层名管理
  • WuliArt Qwen-Image Turbo精彩案例:Cyberpunk/Anime/Realistic三风格对比生成
  • 基于yz-女生-角色扮演-造相Z-Turbo的Typora文档自动化生成
  • 解决Ubuntu上的WebHID权限问题
  • 新手必看:Qwen3-TTS-Tokenizer-12Hz快速部署与使用
  • 手把手教你用AnythingtoRealCharacters2511:动漫转真人一键搞定
  • 大数据日志监控告警系统设计:从理论到实践
  • 单北斗GNSS在变形监测中的应用与发展新趋势
  • STM32通用定时器PWM输出实战:从电机控速到LED调光(附完整代码)
  • Nano-Banana安全防护指南:企业级API访问控制与内容过滤
  • Flutter 3.41 更新要点速评:主打优化,避坑AGP 9
  • 通义千问3-Reranker-0.6B:快速优化企业搜索体验
  • Qwen3-4B Instruct-2507效果展示:会议纪要→待办事项→责任人分配自动化
  • 2026合肥旧房翻新团队评测:木然装饰领跑口碑榜 - 2026年企业推荐榜
  • DDColor镜像体验:三步骤让泛黄照片重现当年色彩
  • MedGemma X-Ray快速上手指南:Gradio医疗影像分析平台实操手册
  • 5分钟搞定:Qwen3-ASR-1.7B语音识别部署教程
  • SmolVLA开源模型价值:比同类VLA模型小3倍参数量,保持90%+任务成功率
  • 强制唤醒隐私:利用 Serverless DoH 为所有 Cloudflare 站点注入 ECH 配置!
  • granite-4.0-h-350m应用指南:从部署到实际使用
  • 机器学习:ROC曲线实战解析
  • GLM-4-9B-Chat-1M一文详解:长上下文训练数据构造方法、去重策略与质量过滤机制
  • 抖音合集高效解决方案:智能工具助你告别重复操作
  • YOLO X Layout算法优化:提升文档识别精度的关键技术
  • StructBERT轻量级部署:CPU环境也能跑的情感分析
  • Linux下vcan虚拟CAN接口配置全攻略:从零搭建到实战通信