CMake使用笔记(带ui文件的Qt程序)

本文详细介绍了如何在CMake中配置Qt5项目,包括设置编译目录、查找源文件、调用Qt5库、处理UI文件以及设置编译选项。同时,还分享了手动添加Qt5路径、设置编译类型和字符集的方法,并提供了项目结构的示例。文章最后总结了编译过程中可能遇到的问题和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.包含目录。

set(CMAKE_INCLUDE_CURRENT_DIR ON) #包含编译目录
AUX_SOURCE_DIRECTORY(Dlg Dlg_cpp) #查找指定目录下的所有源文件,然后将结果存进指定变量名
aux_source_directory(. SRC_LIST) # 查找当前目录下的所有源文件 aux_source_directory(./Src SRC_LIST)

FILE(GLOB file_h ./**)            #加载文件夹下的所有文件
FILE(GLOB Dlg_file Dlg/**)        #以当前CMakeLists路径作为相对路径,加载Dlg文件夹下的所有文件       
file(GLOB Dlg_h "Dlg/*.h")        #可按路径增加子目录,但在vs中暂只显示一级目录
LIST(APPEND Dlg_file ${Dlg_h} ${Dlg_cpp} ${Dlg_ui}) #变量合并

尝试包含子文件夹(在vs中暂只显示一级目录)
GLOB_RECURSE 自动包含所有子文件夹下的文件

add_executable(main)
file(GLOB_RECURSE sources CONFIGURE_DEPENDS *.cpp *.h)
target_sources(main PUBLIC ${sources})

二.调用Qt5

2.1 基于环境变量(可为msvc2015_64/lib/cmake/Qt5)

set(CMAKE_PREFIX_PATH $ENV{Qt5}) #系统路径建议直接包含../lib/Qt5/.cmake文件
find_package(Qt5 COMPONENTS Core Gui Widgets Charts REQUIRED) # Qml Quick Network Xml 

2.2 手动添加(不需本机Qt5环境,但仍需相关cmake文件,但将源码目录进行一定程度剥离简化)

set(Qt5_DIR "${PROJECT_SOURCE_DIR}/Extern/Qt512/lib/cmake/Qt5")
set(Qt5Core_DIR "${PROJECT_SOURCE_DIR}/Extern/Qt512/lib/cmake/Qt5Core")
set(Qt5Gui_DIR "${PROJECT_SOURCE_DIR}/Extern/Qt512/lib/cmake/Qt5Gui")
set(Qt5Widgets_DIR "${PROJECT_SOURCE_DIR}/Extern/Qt512/lib/cmake/Qt5Widgets")
set(Qt5Charts_DIR "${PROJECT_SOURCE_DIR}/Extern/Qt512/lib/cmake/Qt5Charts")
 
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/Extern/Qt512/include/QtCharts")
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/Extern/Qt512/include/QtCore")
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/Extern/Qt512/include/QtGui")
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/Extern/Qt512/include/QtWidgets")
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/Extern/Qt512/include")
LINK_DIRECTORIES("${PROJECT_SOURCE_DIR}/Extern/Qt512/lib")

find_package(Qt5Core)
find_package(Qt5Gui)
find_package(Qt5Widgets)
find_package(Qt5Charts)

SET(file_lib
  Qt5::Core
  Qt5::Gui
  Qt5::Widgets
  Qt5::Charts   
)

Unknown CMake command “qt_add_resources”

2.3 编译ui文件(CMAKE_AUTOUIC,QT5_WRAP_UI)

#set(CMAKE_AUTOMOC ON)   #QObject派生的C++类也需要通过moc进行处理 生成目录下有Demo_automoc文件(去掉才能编过)            
#set(CMAKE_AUTOUIC ON) #屏蔽bin目录可能不生成ui.h

file(GLOB file_ui "./*.ui")
QT5_WRAP_UI(ui_FILES ${file_ui} ) #将.ui文件转换为对应的C++头文件,要置CMAKE_AUTOUIC为OFF

【Qt5】Qt Creator中CMake的qt5_wrap_ui函数

2.4 Qt5调用Qt6的cmake文件

Qt6改为Qt5
qt_add_resources/qt6_add_resources改为qt5_add_resources#Unknown CMake command "qt_add_resources"
qt_add_lupdate、qt_add_lrelease、qt_add_resources屏蔽

Qt6.5 CMake项目配置

三.其它

3.1 set_property

set_property(GLOBAL PROPERTY USE_FOLDERS ON) #打开允许创建文件夹的开关 BUILD、Zero放在CMakePredefinedTargets
#set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets") #给cmake自动创建的工程重新命名(此步骤可以省略)

3.2 设置(release/字符集)

#set(CMAKE_BUILD_TYPE "Release") #Release需加引号
set(CMAKE_BUILD_TYPE Release CACHE STRING "set build type to Release")
add_compile_options("/utf-8")
set(CMAKE_CXX_STANDARD 11)

四.示例

project(oeImageCenter) # VERSION 0.1
cmake_minimum_required(VERSION 2.6)

set(CMAKE_BUILD_TYPE "Release") #Release需加引号
add_compile_options("/utf-8")

INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/oeGraphicsView") #解决ui_MainWindow.h找不到MyGraphicsView 
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/Core")
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/Gui")

INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/Extern/opencv450/include")
LINK_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/Extern/opencv450/lib") 
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/Extern/libtiff")
LINK_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/Extern/libtiff")
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/Extern/ImageShop/include")
LINK_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/Extern/ImageShop/lib")
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/Extern/oeBase/include")
LINK_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/Extern/oeBase/lib")

include_directories(${PROJECT_BINARY_DIR}/Gui) #解决找不到ui_oeImageCenter.h

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_AUTOMOC ON)   #QObject派生的C++类也需要通过moc进行处理 生成目录下有Demo_automoc文件(去掉才能编过)    
set(CMAKE_AUTOUIC ON)

set(CMAKE_PREFIX_PATH $ENV{Qt5}) #Qt5为系统环境变量名 Qt512
find_package(Qt5 COMPONENTS Core Gui Widgets Charts REQUIRED) # Qml Quick Network Xml

add_subdirectory(Core)
add_subdirectory(oeGraphicsView)
add_subdirectory(Gui)

SET(file_lib
  Qt5::Core
  Qt5::Gui
  Qt5::Widgets
  Qt5::Charts
  #Qt5::Network
  #Qt5::Xml
  #CTKCore
  #CTKWidgets
  libtiff_64
  opencv_world450#d
  ImageShop
  oeBase
  Core/Release/Core#Debug
  Gui/Release/Gui
  oeGraphicsView/Release/oeGraphicsView #bin目录下    
)

#file(GLOB file_qrc "./*.qrc")  oeImageCenter.qrc
add_executable(${PROJECT_NAME} main.cpp ${Core} ${Gui} ${MyGraphicsView})# main.cpp ${file_}   ${HEADERS} ${SOURCES} ${RESOURCES} ${QMLS}

target_link_libraries(${PROJECT_NAME} ${file_lib}) #${PROJECT_NAME}  

五.使用总结

1.编译失败,需重新cmake、手动删除moc文件。
2.调用tianya,openssl报错。
Could NOT find OpenSSL
3.cmake工程不建议手动添加文件到项目
VS工程右键添加类文件,声明不调用编译正常,new调用LNK2001报错(猜测cmake会将每个文件记录到工程文件,并按此演绎)。
需重新cmake。
解决qt中cmake单独存放 .ui, .cpp, .h文件

六.参考链接

CMake与Qt4/Qt5的结合使用指南

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值