解决qt中cmake单独存放 .ui, .cpp, .h文件
设想
项目文件较多,全部放在一个目录下就像依托答辩。
希望能将头文件放入include
,ui文件放入ui
,源文件放入src
。
为了将Qt代码和一般非Qt代码分离开,进一步地:
- 将Qt源文件放入
qt_src
,普通源文件放入src
- 将Qt头文件放入
qt_include
,普通头文件放入include
- 将Qt ui文件放入
ui
。
并且使用set(CMAKE_AUTOUIC ON)
、set(CMAKE_AUTOMOC ON)
来让它自己处理。
过程中还是遇到一些问题,通过看官方文档和其他人的提问得以解决,在这里分享一下。
目录结构 && CMakeLists.txt
简化问题,就暂时只搞了顶层一个CMakeLists.txt
。
cmake_minimum_required(VERSION 3.1)set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_PREFIX_PATH /opt/Qt/6.3.2/gcc_64 /opt/paddlepaddle)
set(EXE main)
project(${EXE})aux_source_directory(qt_src SRC)
aux_source_directory(src SRC)
aux_source_directory(qt_src SRC)FILE(GLOB QT_INC "qt_include/*.h")
list(APPEND CMAKE_AUTOUIC_SEARCH_PATHS "ui")
add_executable(${EXE} ${SRC} ${QT_INC})find_package(Qt6 REQUIRED COMPONENTS Widgets)
find_package(OpenCV 4 REQUIRED)
find_package(FastDeploy REQUIRED)target_include_directories(${EXE} PUBLIC${FASTDEPLOY_INCS} include qt_include)target_link_directories(${EXE} PUBLIC /usr/lib/seetaface6)
target_link_libraries(${EXE}PUBLIC Qt6::Widgets${OpenCV_LIBS}${FASTDEPLOY_LIBS}SeetaAgePredictor600SeetaAuthorizeSeetaEyeStateDetector200SeetaFaceAntiSpoofingX600SeetaFaceDetector600SeetaFaceLandmarker600SeetaFaceRecognizer610SeetaFaceTracking600SeetaGenderPredictor600SeetaPoseEstimation600SeetaQualityAssessor300tennis_haswelltennis_pentiumtennis_sandy_bridgetennis)
主要看一下根目录,设想里面已经说了我的放置策略。
## 项目根目录
$ ls
build CMakeLists.txt include qt_include qt_src src ui
下面是目录详细内容,不过不是我们的重点。
## 普通源文件目录
$ ls src
app.cpp FaceAction_demo.cpp PPMatting_StaticLib_cpu.cpp video.cpp
emotion.cpp handler.cpp step.cpp
FaceAction.cpp model.cpp to.cpp
## 普通头文件目录$ ls include
app.h FaceAction.h model.h step.h video.h
emotion.h handler.h PPMatting_StaticLib_cpu.h to.h
## Qt代码源文件目录$ ls qt_src
cv2seetaimage.cpp main.cpp register_widget.cpp user_info.cpp
faceinfo.cpp mainfunction.cpp seetafacetools.cpp
facelogin.cpp mainwindow.cpp settingmodel.cpp
login_widget.cpp register_info.cpp trans.cpp
## Qt头文件目录
$ ls qt_include
cv2seetaimage.h login_widget.h register_info.h settingmodel.h
faceinfo.h mainfunction.h register_widget.h trans.h
facelogin.h mainwindow.h seetafacetools.h user_info.h
## ui文件目录$ ls ui
facelogin.ui mainfunction.ui register_info.ui user_info.ui
login_widget.ui mainwindow.ui register_widget.ui
问题 && 解决
1. 批量添加ui文件和.h文件
笨方法是手动,把文件一个一个加进去,这样不够方便。
对于源文件,我们都知道可以用aux_source_directory()
来添加,但是它只会添加源文件,不会添加目录下的.h
文件和.ui
文件。
解决方法:
FILE(GLOB UI "ui/*.ui")
FILE(GLOB INC "include/*.h")
提一句,有看到说FILE GLOB邪恶的,也许有什么缺点,暂且没有过度关注。
2. AUTOUIC找不到ui文件
由于采用set(CMAKE_AUTOUIC ON)
的方式处理ui文件,编译时会报错找不到ui文件。
需要将ui文件夹加入AUTOUIC
的搜索目录,这样AUTOUIC
处理时才能找到ui文件。
解决方法:
list(APPEND CMAKE_AUTOUIC_SEARCH_PATHS "ui")
注意:是
CMAKE_AUTOUIC_SEARCH_PATHS
,而不是AUTOUIC_SEARCH_PATHS
。这个把我坑惨了。
接下来可能会继续报错找不到生成的对应的ui_XXX.h
头文件,可以尝试以下选项之一:
set(CMAKE_INCLUDE_CURRENT_DIR ON)# 其实只要这一条就够了,后面两条似乎也可以。
include_directories(${CMAKE_BINARY_PATH})
include_directories(${CMAKE_CURRENT_BINRAY_PATH})
因为自动生成的ui_XXX.h
头文件是在构建目录下的,添加它即可。
3. AUTOMOC找不到定义(undefined to 'vtable for XXX'
)
这个是最让我头疼的,cmake官网也没有说怎么解决。(这部分还专门翻译了一下,见我的另一篇博客:cmake-qt AUTOMOC)
看到网上的解释,意思是如果你不在add_executable()
中添加使用了Qt元系统的头文件,那么AUTOMOC
就不会处理这些头文件。
所以我们把Qt的头文件加入到add_executable()
即可,这也是我为什么将普通头文件和Qt头文件分离开的原因之一(因为普通头文件不需要,虽然加上也没错)。
add_executable(${EXE} ${SRC} ${INC})
4. 资源文件
- 待办
我想后面如果要添加资源文件,那么可能会有类似的问题,遇到了再回来补充。
相关文章:
解决qt中cmake单独存放 .ui, .cpp, .h文件
设想 项目文件较多,全部放在一个目录下就像依托答辩。 希望能将头文件放入include,ui文件放入ui,源文件放入src。 为了将Qt代码和一般非Qt代码分离开,进一步地: 将Qt源文件放入qt_src,普通源文件放入sr…...
操作系统(day12)-- 基本分段存储,段页式存储
基本分段存储管理方式 不会产生内部碎片,会产生外部碎片 分段 按照程序自身的逻辑关系划分为 若干个段,每个段都有一个段名,每段从0开始编址 分段存储管理方式中一个段表项由段号(隐含)、段长、基地址 分段的段表项固…...
疯狂弹出请插入多卷集的最后一张磁盘窗口
整个人嘛了,今天插上U盘,跟tmd中了病毒一样, 屏幕疯狂弹出窗口, 提示请插入多卷集的最后一张磁盘! 点确定之后他继续弹出,点取消它也继续弹出, 关掉一个又弹出来一个,妈的&#x…...
Spark12: SparkSQL入门
一、SparkSQL Spark SQL和我们之前讲Hive的时候说的hive on spark是不一样的。hive on spark是表示把底层的mapreduce引擎替换为spark引擎。而Spark SQL是Spark自己实现的一套SQL处理引擎。Spark SQL是Spark中的一个模块,主要用于进行结构化数据的处理。它提供的最核…...
show profile和trance分析SQL
目录 一.show profile分析SQL 二.trance分析优化器执行计划 一.show profile分析SQL Mysql从5.0.37版本开始增加了对show profiles和show profile语句的支持。show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。。 通过have_profiling参数,能够…...
[AI生成图片] 效果最好的Midjourney 的介绍和使用
Midjourney介绍: 是一个文本生成图片的扩散模型,能够根据输入的任何文本生成令人难以置信的图像,让数十亿人在几秒钟内创造惊人的艺术。为方便用户控制和快速生成图片,打开后在页面底部输入文本内容,稍等一小会&#…...
Vue.use( ) 的核心原理
首先来思考几个问题: Vue.use是什么? vue.use() 是vue提供的一个静态方法,主要是为了注册插件,增加vue的功能。 Vue.use( plugin ) plugin只能是Object 或 Function vue.use()做了什么工作? 该js如果是对象 该对象…...
idea同时编辑多行-winmac都支持
1背景介绍 idea编辑器非常强大,其中一个功能非常优秀,很多程序员也非常喜欢用。这个功能能够大大大提高工作效率-------------多行代码同时编辑 2win 2.1方法1 按住alt鼠标左键上/下拖动即可 这样选中多行后,可以直接多行编辑。 优点&a…...
亿级高并发电商项目-- 实战篇 --万达商城项目 十一(编写商品搜索功能、操作商品同步到ES、安装RabbitMQ与Erlang,配置监听队列与消息队列)
👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 Ǵ…...
数据结构概述和稀疏数组
数据结构和算法内容介绍 1)算法是程序的灵魂,优秀的程序可以在海量数据计算时,仍然保持高速计算 数据结构和算法概述 1)程序 数据结构算法 2)学好数据结构可以编写出更加漂亮,更加有效率的代码 3&…...
宝塔搭建实战人才求职管理系统adminm前端vue源码(三)
大家好啊,我是测评君,欢迎来到web测评。 上一期给大家分享骑士cms后台admin前端vue在本地运行打包、宝塔发布部署的方式,本期给大家分享,后台adminm移动端后台vue前端怎么在本地运行,打包,实现线上功能更新…...
服务器是干什么用的?
首先,什么是服务器?服务器是提供计算服务器和网络服务的设备。服务器和计算机由CPU、硬盘、内存、系统总线等组成。比如我们访问一个网站,点击这个网站会发出访问请求,服务器会响应服务请求,进行相应的处理,…...
C++ 之结构体与共用体
文章目录参考描述结构体使用(基本)声明初始化先创建后初始化C 11 列表初始化使用(进阶)结构数组声明(拓展)声明及创建声明及初始化匿名结构体细节外部声明与内部声明成员赋值共用体存储空间匿名共用体同化尾…...
Java基础知识汇总(良心总结)
1. 前言 本文章是对Java基础知识进行了汇总,方便大家学习。 申明:文章的内容均来自黑马程序员,博主只是将其搬到了CSDN上以共享给大家学习 2. 目录 Day01 Java学习笔记之《开章》 Day02 Java学习笔记之《运算符》 Day03 Java学习笔记之《流程…...
InnoDB之Undo log格式
1. 前言 InnoDB有两大日志模块,分别是redo log和undo log。为了避免磁盘随机写,InnoDB设计了redo log,数据写入时只写缓冲页和redo log,脏页由后台线程异步刷盘,哪怕系统崩溃也能根据redo log恢复数据。但是我们漏了一…...
一问学习StreamAPI终端操作
Java Stream管道流是用于简化集合类元素处理的java API。 在使用的过程中分为三个阶段: 将集合、数组、或行文本文件转换为java Stream管道流管道流式数据处理操作,处理管道中的每一个元素。上一个管道中的输出元素作为下一个管道的输入元素。管道流结果…...
在屎山代码中快速找到想要的代码法-锁表法(C#)
由于本人水平有限,文中有写得不对的地方请指正,本文的方法有些投机取巧,实在是没招的情况下可以酌情使用,如有侵权,请联系删除。 前几天接到一个需求,要在医嘱签署时对检验项目进行分方操作,分…...
网页设计html期末大作业
网页设计html期末大作业网页设计期末大作业-自制网站大一期末作业,外卖网站设计网页设计期末大作业-精美商城-首页框架网页设计期末大作业-自制网站 有导航栏,轮播图,按钮均可点进去,如下图所示 点我下载资源》》》》 大一期末…...
实战打靶集锦-006-Stapler
**写在前面:**记录博主的一次打靶经历。 目录1. 主机发现2. 端口发现3. 服务枚举4. 服务探查4.1 FTP探查4.1.1 匿名登录4.1.2 Elly用户4.1.3 John用户4.1.4 EXP搜索4.2 dnsmasq探查4.2.1 基础信息获取4.2.2 EXP搜索4.3 WEB应用探查4.3.1 浏览器访问4.3.2 目录扫描4.…...
致远OAA6版安装
准备工作,操作系统winserver2019,sqlserver2019。致远OA安装包0.SeeyonInstall.zip相关下载:winserver2019下载地址:cn_windows_server_2019_updated_july_2020_x64_dvd_2c9b67da.iso magnet:?xturn:btih:22A410DEA1B0886354A34D…...
python实用脚本(六)—— pandas库的使用(生成、读取表格)
本期主题: python的pandas使用 往期链接: python实用脚本(一)—— 批量修改目标文件夹下的文件名python实用脚本(二)—— 使用xlrd读取excelpython实用脚本(三)—— 通过有道智云AP…...
字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码、解码问题等
编码解码一、背景二、字符的相关概念三、字符集3.1 ASCII[ˈski]3.1.1 ASCII的编码方式3.1.2 EASCII3.2 GBK3.2.1 GB 2312-803.2.2 GBK的制订3.2.3 GBK的实现方式3.3 Unicode(统一码、万国码)3.3.1 Unicode的出现背景3.3.2 Unicode的编写方式3.3.3 Unico…...
Java 布隆过滤器
你在么?在!一定在么?不在!一定不在么? 你想要100%的准去性,还是99%的准确性附带较高的速度和较小的资源消耗。 任何算法,任何经营收到的背后,都是时间效益 资源消耗 准确性的平衡&am…...
vscode连接服务器(腾讯云)
文章目录1. vscode远程总是报错2. vscode能连上腾讯云但密码不对或者登录后不能打开文件或文件夹1. vscode远程总是报错 报错如图所示 Could not establish connection to *** 过程试图写入的管道不存在。 在百度、csdn找了好久都是说删掉.ssh文件下的某个文件但我压根没有&a…...
IOS崩溃文件符号化实践
1.背景与项目难点 1.1 背景 由于公司之前使用的友盟要收费,filebase服务由谷歌提供,存在数据合规风险。需要实现稳定性分析功能,通过支持app崩溃信息实时采集、实时上报、实时自动解析并定位出代码问题,帮助研发同学及时定位崩溃…...
设计模式之适配器模式与桥接模式详解和应用
目录1 适配器模式1.1 定义1.2 应用场景1.3 适配器角色1.4 类适配器1.5 对象适配器1.5 接口适配器1.6 实战1.7 源码1.8 适配器与装饰器的对比1.9 适配器模式的优缺点1.10 总结2 桥接模式2.1 原理解析2.2 角色2.3 通用写法2.4 应用场景2.5 业务场景中的运用2.6 源码2.7 桥接模式优…...
Winform控件开发(14)——NotifyIcon(史上最全)
前言: 先看个气泡提示框的效果: 代码如下: 在一个button中注册click事件,当我们点击button1时,就能显示气泡 private void button1_Click(object sender, EventArgs e){notifyIcon1.Visible = true;notifyIcon1...
Verilog 学习第四节(从计数器到可控制线性序列机——LED实验进化六部曲)
从计数器到可控制线性序列机——LED实验进化六部曲一:让LED灯按照亮0.25s,灭0.75s的状态循环亮灭二:让LED灯按照亮0.25s,灭0.5s,亮0.75s,灭1s的状态循环亮灭三:让LED灯按照指定的亮灭模式亮灭&a…...
操作SSH无密登录配置
例如小编有三台服务器需要相互访问,就需要配置三台,这三台分别是hadoop102,hadoop103 , hadoop1041.打开三个服务器,分别生成hadoop102,hadoop103 , hadoop104的公钥和私钥输入命令,然后一直回车,这时候什么…...
Websocket详细介绍
需求背景 在某个资产平台,在不了解需求的情况下,我突然接到了一个任务,让我做某个页面窗口的即时通讯,想到了用websocket技术,我从来没用过,被迫接受了这个任务,我带着浓烈的兴趣,就…...
wordpress在线客服插件/网络营销服务商有哪些
钩子方法 pytest_runtest_makereport 可以清晰的了解用例的执行过程,并获取到每个用例的执行结果。 钩子方法 pytest_runtest_makereport 源码: 按照执行顺序,具体过程如下: 1、先判断,当 report.when setup 时&…...
网站手机版建设/十大短视频平台排行榜
1 背景 结构方程模型是很常见的一种研究,目前R已经可以完成该内容的分析。 本文将介绍用R进行SEM的分析和研究。 2 数据介绍 PS: 数据链接上传到资源,可以关注后免费下载(只有积分和关注两个选项呀),一般小伙伴用来…...
西安网站建设首选/优化系统的软件
原标题:「数控干货」基于UG CLS文件使用 C 语言制作智能后处理工具1 前言UG 后处理操作是 UGCAM 数控加工工作中一个重要环节,主要任务是把在 UG 加工环境下生成的加工刀位文件转换成机床可接受的数控代码文件。UG 本身提供了强大的 Post Builder 后处理…...
优化网站和网站建设/昆山网站建设公司
CMPSC-121作业代做、代写C/C语言作业、代做Programming Techniques作业、代写C/C程序设计作业CMPSC-121: Intro to Programming Techniques (Fall 2018)Project 2 - Fall 2018 (100 points)Due Sunday, October 28 at 11:59pmObjectivesAfter this project, students should be…...
一定seo自己网站吗/域名注册
重心放在大目标上面,长远目标,不要为了短期的,眼前的利益所诱惑。 同时要将功能的学习放在重点,比如字符处理。转载于:https://www.cnblogs.com/daishuguang/archive/2013/05/05/3061552.html...
购物网站建设优缺点/百度搜索风云榜小说排行榜
CRM是最常用的后台管理系统之一,以下为CRM的原型设计思路及框架 基本页面axure: 链接: https://pan.baidu.com/s/1tcuVdUw0f9jO4h4D-TPRJQ 密码: tj4h 基本组件axure: 链接: https://pan.baidu.com/s/1zVN-626LW6g24ioqgzmPcw 密码: suqf...