解决qt中cmake单独存放 .ui, .cpp, .h文件

这篇具有很好参考价值的文章主要介绍了解决qt中cmake单独存放 .ui, .cpp, .h文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

创建时间:2023-02-18 17:58:04

设想

项目文件较多,全部放在一个目录下就像依托答辩。

希望能将头文件放入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

(这里只添加了必须的,如果你使用Qt Creator,最好将头文件、ui文件什么的都加进去,不然它里面看不到)

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}
         SeetaAgePredictor600
         SeetaAuthorize
         SeetaEyeStateDetector200
         SeetaFaceAntiSpoofingX600
         SeetaFaceDetector600
         SeetaFaceLandmarker600
         SeetaFaceRecognizer610
         SeetaFaceTracking600
         SeetaGenderPredictor600
         SeetaPoseEstimation600
         SeetaQualityAssessor300
         tennis_haswell
         tennis_pentium
         tennis_sandy_bridge
         tennis)

主要看一下根目录,设想里面已经说了我的放置策略。

 ## 项目根目录
$ 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. 资源文件

  • 待办

我想后面如果要添加资源文件,那么可能会有类似的问题,遇到了再回来补充。


2023.5.7更新:
资源文件,也就是CMAKE_AUTORCC的篇幅较多,不宜在这里展开,见另一篇博客:
探索qrc,rcc和CMAKE_AUTORCC文章来源地址https://www.toymoban.com/news/detail-782256.html

到了这里,关于解决qt中cmake单独存放 .ui, .cpp, .h文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VS_Qt在项目中新建子窗体ui,并手动生成.h文件、.cpp文件(后续有问题再更改)--在VS中手动配置ui文件和类

    创建步骤及注意事项: 步骤1:创建ui文件; 方法1:通过vs中 右击项目—添加—新建项,打开下图,创建所需窗体ui 方法2:直接打开Qt Designer,创建我们所需的ui文件;创建完成后,保存到当前项目目录中,然后由vs导入ui文件到项目中; 步骤2:创建ui文件的类 首先:创建一

    2024年02月02日
    浏览(58)
  • cmake使得工程中每个文件可以单独作为一个可执行程序

    通过cmake管理一个工程,工程中的src文件夹里面放了很多cpp源文件,每个源文件里面都包含一个main方法,这个工程主要是用于测试一些方法,因此希望每个源文件都可以单独编译并且调试。 写法如下,就是循环查找src路径下的cpp文件,然后对每个cpp文件建立一个可执行程序,

    2024年04月17日
    浏览(37)
  • 【CMake】第2篇 CMake构建.h与.cpp文件

    目录 1、文件目录结构 add.h  add.cpp main.cpp CMakeLists.txt 2、CMake构建项目 3、构建工程优化 使用 aux_source_directory(./src SRC_LIST)  4、优化目录,生成可执行文件到bin下 首先来看一下目前的目录结构: add.h  add.cpp main.cpp CMakeLists.txt  cmake_minimum_required(VERSION 2.8) 指定cmake的最小版本。

    2023年04月08日
    浏览(33)
  • cpp文件编译过程 makefile cmake

    直接 gcc 没有-o 的话出来的输出exe文件没有调试信息,相比-o的大小会小一点,只有包含了调试信息文件才可以执行 头文件在编译器的include目录中,编译时 -I 指定库 函数库默认路径在编译器的lib目录中,编译时 -L指定目录,-l 小写L 指定库 函数或者是在别的c与cpp文件中 静态

    2024年02月08日
    浏览(37)
  • VS打开Qt Designer(UI文件.ui)失败的解决方法

    VS打开Qt Designer失败的根本原因:VS中默认的Qt Designer路径是错误的。所以要正常使用需要重新设置 1、设置VS中打开Designer的路径 添加成功后,将其设置为默认值

    2024年04月11日
    浏览(44)
  • visual studio c++单项目中存在多个cpp,怎么单独运行某个cpp

    首先一个项目里只能有一个main方法。如果有多个cpp,这些cpp总共包含多个mian方法,点击 “本地windows 调试器”时,会报\\\"main已经在helloworld.obj中定义\\\"。  如果要调试.cpp,那么须保证这个项目里面只有一个main方法。 所以参考以下解决方案 1. 单个项目中保证多个cpp中只有一个

    2024年02月16日
    浏览(42)
  • QT第一个程序命名空间详解,解释ui_widget的和xxx.cpp的联系

    首先需要回顾一下cpp命名空间知识; 一个文件中书写了两个相同名字的命名空间,第二个命名将作为第一个命名空间的补充 例如: 第一个Ui命名空间是一个前置声明;第二个Ui是具体定义,就跟函数声明和函数名义一模一样 以上代码等价于一下代码: ui_xxxx.h文件 有一个命名

    2024年01月18日
    浏览(43)
  • vs打开qt的ui文件,报错闪退+已解决

    触发行为: 使用vs打开项目,点击ui文件后,数秒后qt designer闪退  报错内容: 方法一:鼠标右击 在qt designer 打开后,闪退前,鼠标右击 方法二:打开qt designer ,打开最近窗口 扩展-qt-qt vs tools-launch qt designer    方法三:自定义打开方式  鼠标右击ui文件,选择打开方式,选

    2024年02月15日
    浏览(55)
  • VS打开Qt的ui界面后闪退(ui无法打开文件)的解决办法

    VS打开Qt的ui界面几秒后闪退(ui无法打开文件)的解决办法 问题: 近两天在vs中直接点解ui界面,自动调用Qt Designer打开界面几秒后Designer界面闪退,回到vs界面,并有“——.ui无法打开文件”的错误提示。 这个问题应该是Windows或Qt哪些东西更新造成的,用Qt的几个同学都有反

    2024年02月11日
    浏览(71)
  • Qt:ui文件no member named actionXXX 解决方案

    首先应该保证与UI中的 标识一一对应 ​  如果我们后续修改ui后,这时同样会出现此问题,解决办法就是需要进行编译,否则找不到刚添加的部件。每次添加控件后都需要点击一下锤子图标 编译 一下 ​ 原因是ui中并没有提供对应 方法 ,需要头文件引用。如:

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包