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

CMake练习

在昨天我学了CMake之后,于是我就打算把我之前写的一个小demo配上CMakeLists,毕竟那个项目只能在我电脑上运行,我还不知道怎么让别人的电脑跑那个项目
而且我之前没有学vcpkg,所有的第三方库都是我自己手动编译成.lib文件的,所以配这个CMakeLists中也非常麻烦
我首先是把CMakeLists的框架搭好了,大概就是规定了cmake的版本,规定了生成项目的名字和语言,之后让QT查找对应的MOD,qrc,ui,坚持QT的版本和各个模块是否能用
把源码(.cpp|.h|.ui)收集起来,生成可执行文件,然后把第三方的.lib链接库收集起来,且对应的.h文件也收集起来,大概就是这样,然而在我编译的时候却出问题了
问题一:因为这些都是我自己手动编译的第三方库,之前在vs中改改路径就能用,可是到了cmake中会缺少一些东西,比如说QXlsx,你不止要包含QXlsx的.lib,链接库时还要包含Qt${QT_VERSION_MAJOR}::GuiPrivate,除此之外,libcurl这个库也是,还要在链接库的时候加上ws2_32,wldap32,crypt32,normaliz,还要加上设置libcurl的静态库,还有jsoncpp,之前在vs中编译没问题,但是在cmake中又会提示你版本不对应,总之就是有非常非常多的问题,以后真的还是用vcpkg吧

点击查看代码
cmake_minimum_required(VERSION 3.10)
project(MedicalEngineering VERSION 1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)#让Qt工具查找生成的头文件/资源文件(避免UI/MOC路径错误)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
#检查Qt5,6,各个模块是否能用
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Network Quick Widgets Sql)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network Quick Widgets Sql)
#收集源码
file(GLOB_RECURSE SOURCESmain.cppsrc/*.cpp
)
#收集头文件
file(GLOB_RECURSE HEADERSsrc/*.h
)
#收集ui文件
file(GLOB_RECURSE UI_FILES${CMAKE_CURRENT_SOURCE_DIR}/ui/*.ui
)
#设置所有的文件
set(SRC${SOURCES}${HEADERS}${UI_FILES}image.qrcMedicalEngineeringProject.qrc
)#设置可执行文件
add_executable(MedicalEngineering ${SRC})
#收集.lib库文件
file(GLOB_RECURSE THIRD_PARTY_LIBS${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/*/lib/*/*.lib${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/*/lib/*.lib
)#配置头文件包含(除了aip-cpp-sdk-4.16.7,其他都包含到上级.h目录)
target_include_directories(MedicalEngineeringPRIVATE${CMAKE_CURRENT_SOURCE_DIR}/src#第三方库目录${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/aip-cpp-sdk-4.16.7${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp/include${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/libcurl/include${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/OpenSSL-Win64/include${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/QXlsx
)
#链接库
target_link_libraries(MedicalEngineeringPRIVATEQt${QT_VERSION_MAJOR}::CoreQt${QT_VERSION_MAJOR}::NetworkQt${QT_VERSION_MAJOR}::QuickQt${QT_VERSION_MAJOR}::WidgetsQt${QT_VERSION_MAJOR}::SqlQt${QT_VERSION_MAJOR}::GuiPrivate${THIRD_PARTY_LIBS}ws2_32wldap32crypt32normaliz
)install(TARGETS MedicalEngineeringRUNTIME DESTINATION bin
)
**问题二:**乱码问题:之前在vs中运行程序本来是UTF-8,但是当程序到Qt中就变成了乱码(这时千万不要直接在编辑界面把源码改成local或者其他的),如果我们用记事本打开文件的话就会发现,它的编码居然是ANSI类型,这里提一句,如果你直接在编辑界面把编码类型改成了local或者其他类型,编译器会提示你那种少")"或者少";"的错误,一般这种错误都是编码错误的问题 ![image](https://img2024.cnblogs.com/blog/3751099/202602/3751099-20260225110045296-1550450375.png) 为了解决这个问题我们首先要把它们都用UTF-8 BOM保存下来 ![image](https://img2024.cnblogs.com/blog/3751099/202602/3751099-20260225110138634-1019179810.png) 然后打开Qt,依次设置,最后在文本编译器中把UTF-8改为UTF-8 BOM,然后在CMakelists中加入这样一段代码(在可执行文件设置之前),保存,然后关掉Qt,删除对应的build,重新cmake一下就行
点击查看代码
if(MSVC)# 只添加 /utf-8,不要加其他编码参数add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>""$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
endif()
![image](https://img2024.cnblogs.com/blog/3751099/202602/3751099-20260225110505868-1932403020.png) **问题三:** 文件的包含路径问题,这个问题其实在我们编码的过程中就能避免,但是我当初做这个项目的时候还没有把不同类型文件分文件夹的习惯,所以出了这个错误 比如我们的ui文件都会编译成ui_…….h文件,而我们把ui文件都放在了ui文件夹中,所有的头文件又都放在了src文件夹中,所以当我们引用#include "ui/ui_ExtraLargeImageWidget.h"使需要在ui文件中找,而且需要再CMakeLists中加上这样一段代码
点击查看代码
#防止系统找ui文件去别的文件夹找而不是ui文件夹
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/ui)
最后我又对.dll文件做了下处理,详细我会把完整代码放出来 **总结:**这个CMakeLists真的难配,以后最好还是直接用vcpkg,它能把相关的版本,库,或者其他的东西都加进来,不用手动编译库了,真的巨麻烦,还有编码的问题,这是mscv的通病,按照我的方法改就行,昨天改这玩意真的废了我一天,真麻烦 这是cmakelists源码
点击查看代码
cmake_minimum_required(VERSION 3.10)
project(MedicalEngineering VERSION 1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)#让Qt工具查找生成的头文件/资源文件(避免UI/MOC路径错误)
set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)set(CMAKE_AUTOUIC ON)
#防止系统找ui文件去别的文件夹找而不是ui文件夹
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/ui)
#检查Qt5,6,各个模块是否能用
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Network Quick Widgets Sql)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network Quick Widgets Sql)if(MSVC)# 只添加 /utf-8,不要加其他编码参数add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>""$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
endif()#收集源码
file(GLOB_RECURSE SOURCESmain.cppsrc/*.cpp
)
#收集头文件
file(GLOB_RECURSE HEADERSsrc/*.h
)
#收集ui文件
file(GLOB_RECURSE UI_FILES${CMAKE_CURRENT_SOURCE_DIR}/ui/*.ui
)
#设置所有的文件
set(SRC${SOURCES}${HEADERS}${UI_FILES}image.qrcMedicalEngineeringProject.qrc
)#设置可执行文件
add_executable(MedicalEngineering ${SRC})target_compile_definitions(MedicalEngineering PRIVATECURL_STATICLIB  # 告诉 libcurl 头文件使用静态库方式
)
#收集.lib库文件
file(GLOB_RECURSE THIRD_PARTY_LIBS${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/*/lib/*/*.lib${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/*/lib/*.lib
)#配置头文件包含(除了aip-cpp-sdk-4.16.7,其他都包含到上级.h目录)
target_include_directories(MedicalEngineeringPRIVATE${CMAKE_CURRENT_SOURCE_DIR}/src#第三方库目录${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/aip-cpp-sdk-4.16.7${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/jsoncpp/include${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/libcurl/include${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/OpenSSL-Win64/include${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/QXlsx
)
#链接库
target_link_libraries(MedicalEngineeringPRIVATEQt${QT_VERSION_MAJOR}::CoreQt${QT_VERSION_MAJOR}::NetworkQt${QT_VERSION_MAJOR}::QuickQt${QT_VERSION_MAJOR}::WidgetsQt${QT_VERSION_MAJOR}::SqlQt${QT_VERSION_MAJOR}::GuiPrivate${THIRD_PARTY_LIBS}ws2_32wldap32crypt32normaliz
)#收集.dll文件
file(GLOB_RECURSE ALL_DLLS ${CMAKE_CURRENT_SOURCE_DIR}/*.dll)
#  编译后自动复制到程序输出目录(和exe同目录)
foreach(DLL_FILE ${ALL_DLLS})add_custom_command(TARGET MedicalEngineering POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy_if_different${DLL_FILE}$<TARGET_FILE_DIR:MedicalEngineering>  # exe所在目录)
endforeach()# 4.Qt的DLL自动复制if(WIN32)
add_custom_command(TARGET MedicalEngineering POST_BUILDCOMMAND ${CMAKE_COMMAND} -E env "PATH=${Qt${QT_VERSION_MAJOR}_DIR}/../../../bin"$<TARGET_FILE_DIR:MedicalEngineering>/windeployqt.exe--verbose 0$<TARGET_FILE:MedicalEngineering>
)
endif()install(TARGETS MedicalEngineeringRUNTIME DESTINATION bin
)
http://www.jsqmd.com/news/410613/

相关文章:

  • NeteaseCloudMusicFlac:高效获取无损音乐的全解析
  • 互联网大厂Java求职面试实战:核心技术栈与内容社区UGC场景深度解析
  • AI的提示词专栏:Prompt 与 Python Pandas 的结合使用指南
  • 计算机毕业设计之nodejs基于Android的席位预定系统的设计与实现
  • springboot117-基于JavaWeb的教务管理系统(编号:75778125)
  • 解锁百度网盘全速下载:直链提取工具完全指南
  • 解决SOCD冲突:提升游戏操作体验的键盘输入管理方案
  • VeLoCity-Skin-for-VLC:打造个性化VLC播放器界面的开源解决方案
  • Cys- Ahx-K(5FAM) -Ahx-S(GfO)9-NH2
  • springbootr0361基于springboot的校园论坛系统(论文+PPT)
  • 5步解锁Zotero中文文献管理效率提升90%的实战指南
  • Windows Cleaner:如何在5分钟内解决C盘空间不足问题
  • 交稿前一晚!9个一键生成论文工具测评:本科生毕业论文写作必备神器
  • 用AI自动标准化CAD 图层标准化
  • 如何通过GitHub中文化工具实现高效开发:4个核心维度解析
  • springboot120-基于Java的竞赛管理系统(编号:87075263)
  • 【超详细】Python FastAPI 入门:写给新手的“保姆级”教程
  • FastAPI:Python 高性能 Web 框架的优雅之选
  • Luogu P1463 [POI 2001 R1 / ZJOI2006 / HAOI2007] 反素数 题解
  • springboot119-基于Java的教务管理系统(编号:62528147)
  • 解放《空洞骑士》模组管理:Lumafly的跨平台革命
  • 颠覆式刷题体验:5大维度重构算法训练路径,10万+用户验证效率提升40%
  • Solutions - NOISG 2016
  • 照着用就行:自考必备降AI率软件,千笔 VS 锐智 AI
  • D证——科目三(自用)
  • Ollama视觉模型实测
  • 3个突破限制的资源获取功能:开发者的跨平台模组管理方案
  • 2026年全性能安全门窗十大品牌推荐筑牢居家安全防线 - 资讯焦点
  • 分析水空调地暖安装方案怎么选,杭州德能给出专业解答 - myqiye
  • Python从0到100完整学习指南(必看导航)