[Cmake Qt]找不到文件ui_xx.h的问题?有关Qt工程的问题,看这篇文章就行了。

前言

最近在开发一个组件,但是这个东西是以dll的形式发布的界面库,所以在开发的时候就需要上层调用。

在这里插入图片描述
如果你是很懂CMake的话,ui_xx.h的文件目录在

${CMAKE_CURRENT_BINARY_DIR}

然后除了有关这个ui_xx.h,还有一些别的可以简单聊聊的

一、父子工程组织,或者说依赖关系

在使用CMake进行开发的时候,一般可以有一个上下级的关系,或者一般情况下上下级工程会摆在同一个文件夹下,对于我这个项目来说,View_Equalizer是Demo_View_Equalizer的依赖

在CMake中,如果工程之间有依赖,一般代表了几件事:

  1. 子工程一定是要先于父工程编译的
  2. 父工程需要引用到子工程的所有头文件
  3. 父工程需要链接到子工程

那我们一步步拆解地来看

1.要求子工程优先于父工程编译

可以直接在父工程中添加

add_subdirectory(./View_Equalizer)

的方式来添加子工程,这样的话View_Equalizer就会优先于当前工程进行编译了

2. 要求父工程能引用到子工程的全部头文件

这是因为,如果父工程如果不能引用到子工程的所有头文件的话,很有可能会出现无法编译的情况,即子工程引用了头文件,但是父工程则无法直接引用到所有的头文件,这样父工程的编译就会报错。

为了解决这个问题,我们需要在子工程中添加target_include_directories,以在作为子工程的时候向上传递包含列表

示例如下:

target_include_directories(View_Equalizer PUBLIC 
${CMAKE_CURRENT_SOURCE_DIR}/math 
${CMAKE_CURRENT_SOURCE_DIR}/QCustomPlot 
${CMAKE_CURRENT_SOURCE_DIR}/includes 
${CMAKE_CURRENT_SOURCE_DIR}/Views 
${CMAKE_CURRENT_SOURCE_DIR}/View_Items 
${CMAKE_CURRENT_BINARY_DIR})

需要注意的是,这里target_include_directories传递的是路径,而不是具体的文件,如果传递具体文件的话,上层仍然是找不到的,这里需要注意。

注:关于之前提到的找不到文件ui_xx.h的问题,这个其实就是没有写

target_include_directories(View_Equalizer PUBLIC ${CMAKE_CURRENT_BINARY_DIR})

所有的ui_xx.h文件都会存放在${CMAKE_CURRENT_BINARY_DIR}下,所以将这个目录传递给上层,就不会出现找不到 ui_xx.h的情况了。

3.父工程需要链接子工程

这个很好理解了,在父工程的CMakeLists.txt中添上这么一句话就行了

target_link_libraries(Demo_View_Equalizer PRIVATE View_Equalizer)

二、有关ui、qrc等qt特有的文件

首先,当你在使用CMake编写Qt的时候,这三个属性是必不可少的

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

如果你想要添加ui或者qrc文件,同样的,需要将ui文件添加到add_library的名下,我这里是通过列表的形式插入所有需要的文件

set(HEADER_FILES  ./includes/DataClass.h  ./includes/View_Equalizer_global.h./includes/math_functions.h./includes/Center.h./Views/view_equalizer.h./View_Items/ViewItem_ControlPoint.h./View_Items/PointWidget.h
)  set(SOURCE_FILES 
./src/DataClass.cpp
./src/Center.cpp
./QCustomPlot/qcustomplot.cpp
./Views/view_equalizer.cpp
./View_Items/ViewItem_ControlPoint.cpp
./View_Items/PointWidget.cpp
)set(UI_FILES
./View_Items/PointWidget.ui
)add_library(View_Equalizer SHARED ${HEADER_FILES} ${SOURCE_FILES} ${UI_FILES} ${QRC_SOURCES})

当然了,既然是qt的库,对于ui文件和qrc文件,则需要加入以下两个命令:

qt5_add_resources(QRC_SOURCES ${RESOURCE_FILES})
qt5_wrap_ui(${UI_FILES}) 

子模块完整的CMakeLists.txt放在下面:

cmake_minimum_required(VERSION 3.5)project(View_Equalizer LANGUAGES CXX)#(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(Qt5 COMPONENTS Widgets PrintSupport REQUIRED)include_directories(${CMAKE_CURRENT_SOURCE_DIR}/includes)
set(RESOURCE_FILES  ./Resource/Resource.qrc
)  
qt5_add_resources(QRC_SOURCES ${RESOURCE_FILES})set(HEADER_FILES  ./includes/DataClass.h  ./includes/View_Equalizer_global.h./includes/math_functions.h./includes/Center.h./Views/view_equalizer.h./View_Items/ViewItem_ControlPoint.h./View_Items/PointWidget.h
)  set(SOURCE_FILES 
./src/DataClass.cpp
./src/Center.cpp
./QCustomPlot/qcustomplot.cpp
./Views/view_equalizer.cpp
./View_Items/ViewItem_ControlPoint.cpp
./View_Items/PointWidget.cpp
)set(UI_FILES
./View_Items/PointWidget.ui
)
# 假设生成的头文件被放置在当前构建目录下的对应子目录中  qt5_wrap_ui(${UI_FILES}) add_library(View_Equalizer SHARED ${HEADER_FILES} ${SOURCE_FILES} ${UI_FILES} ${QRC_SOURCES})target_include_directories(View_Equalizer PUBLIC 
${CMAKE_CURRENT_SOURCE_DIR}/math 
${CMAKE_CURRENT_SOURCE_DIR}/QCustomPlot 
${CMAKE_CURRENT_SOURCE_DIR}/includes 
${CMAKE_CURRENT_SOURCE_DIR}/Views 
${CMAKE_CURRENT_SOURCE_DIR}/View_Items 
${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(View_Equalizer PRIVATE Qt5::Widgets Qt5::PrintSupport)target_compile_definitions(View_Equalizer PRIVATE VIEW_EQUALIZER_LIBRARY)

三、关于编译后,组织编译后的内容

我这里是写了一下编译后的事件,可以参考一下

cmake_minimum_required(VERSION 3.5)project(Demo_View_Equalizer LANGUAGES CXX)
add_subdirectory(./View_Equalizer)
add_subdirectory(./QtHid)
set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check http://doc.qt.io/qt-5/deployment-android.html for more information.
# They need to be set before the find_package(Qt5 ...) call.#if(ANDROID)
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
#    if (ANDROID_ABI STREQUAL "armeabi-v7a")
#        set(ANDROID_EXTRA_LIBS
#            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
#            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
#    endif()
#endif()find_package(Qt5 COMPONENTS Widgets REQUIRED)
if(ANDROID)add_library(Demo_View_Equalizer SHAREDmain.cppmainwindow.cppmainwindow.hmainwindow.ui)
else()add_executable(Demo_View_Equalizermain.cppmainwindow.cppmainwindow.hmainwindow.ui)
endif()target_link_libraries(Demo_View_Equalizer PRIVATE Qt5::Widgets)
target_link_libraries(Demo_View_Equalizer PRIVATE View_Equalizer)# 假设View_Equalizer模块的可执行文件或库在构建后将位于对应的Debug或Release目录下  
# 并且想在Demo_View_Equalizer模块构建完成后将其复制到对应的Demo_View_Equalizer的Debug或Release目录  # 获取当前构建类型,默认为Debug,如果未设置CMAKE_BUILD_TYPE  
if(NOT DEFINED CMAKE_BUILD_TYPE)  set(CMAKE_BUILD_TYPE Debug)  
endif()  # 根据构建类型设置A模块的输出目录路径  
set(A_OUTPUT_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}")  # 假设View_Equalizer模块的输出文件名(需要根据实际情况替换)  
set(B_OUTPUT_NAME "View_Equalizer.dll") # 假设的输出文件名  # 设置View_Equalizer模块的输出文件路径  
set(B_OUTPUT_FILE "${CMAKE_BINARY_DIR}/View_Equalizer/${CMAKE_BUILD_TYPE}/${B_OUTPUT_NAME}")  # 目标文件在Demo_View_Equalizer模块的输出目录下的路径  
set(B_OUTPUT_DESTINATION "${A_OUTPUT_DIR}/${B_OUTPUT_NAME}")  message(STATUS "B_OUTPUT_FILE : ${B_OUTPUT_FILE}")
message(STATUS "B_OUTPUT_DESTINATION : ${B_OUTPUT_DESTINATION}")
message(STATUS "command : ${CMAKE_COMMAND} -E copy ${B_OUTPUT_FILE} ${B_OUTPUT_DESTINATION}")
# 添加一个自定义目标,以确保复制操作被执行  
add_custom_target(AllBuild ALL  DEPENDS ${B_OUTPUT_DESTINATION}  
)
# 添加一个自定义命令来执行复制操作  
add_custom_command(  OUTPUT ${B_OUTPUT_DESTINATION}  COMMAND ${CMAKE_COMMAND} -E copy ${B_OUTPUT_FILE} ${B_OUTPUT_DESTINATION}  DEPENDS ${B_OUTPUT_FILE}  COMMENT "Copying View_Equalizer output to Demo_View_Equalizer/${CMAKE_BUILD_TYPE} directory"  VERBATIM  
)  
# 确保我们的自定义目标在Demo_View_Equalizer之后构建  
add_dependencies(AllBuild Demo_View_Equalizer)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Verlog-流水灯-FPGA

Verlog-流水灯-FPGA 引言: ​ 随着电子技术的飞速发展,现场可编程门阵列(FPGA)已成为电子设计自动化(EDA)领域中不可或缺的组件。FPGA以其高度的灵活性和可定制性,广泛应用于通信、图像处理、工…

go-zero整合asynq实现分布式定时任务

本教程基于go-zero微服务入门教程,项目工程结构同上一个教程。 go-zero微服务入门教程(点击进入) 本教程主要实现go-zero整合asynq实现分布式定时任务。 本文源码:https://gitee.com/songfayuan/go-zero-demo (教程源…

外卖点餐单店+多店自由切换小程序源码系统全功能版 带完整的安装代码包以及搭建部署教程

近年来,外卖市场持续火爆,但许多餐饮商家在接入外卖平台时面临着诸多困扰。高昂的平台费用、复杂的操作流程以及数据安全隐患等问题,让商家们倍感压力。为了解决这些问题,小编给大家分享一款集单店与多店管理于一体的外卖点餐系统…

ACM实训冲刺第四天

【碎碎念】最近的任务有点繁重,所以考虑到实际情况,视频学习决定放置一段时间,重点是学校的实训练习题,对于我而言,目标不是优秀/良好,综合考虑我的实际情况,保佑我及格、顺利通过就可&#xff…

通过自建镜像方式搭建RabbitMQ集群

通过自建镜像方式搭建RabbitMQ集群 1. 应用准备1.1 应用目录结构1.2 配置文件1.2.1 .erlang.cookie1.2.2 hosts1.2.3 rabbitmq.conf1.2.4 rabbitmq-env.conf 2. 编写DockerFile2.1 将所有本地文件拷贝到工作目录2.2 拷贝文件到源目录&增加执行权限2.3 安装Erlang & rab…

Leedcode题目:移除链表元素

题目: 这个题目就是要我们将我们的链表中的值是val的节点删除。 我们题目提供的接口是 传入了指向一个链表的第一个节点的指针,和我们要删除的元素的值val,不只要删除第一个, 思路 我们这里可以创建一个新的链表,…

【C++】学习笔记——模板进阶

文章目录 十一、模板进阶1. 非类型模板参数2. 按需实例化3. 模板的特化类模板的特化 4. 模板的分离编译 未完待续 十一、模板进阶 1. 非类型模板参数 模板参数分为类型形参和非类型形参 。类型形参即:出现在模板参数列表中,跟在class或者typename之类的…

掌握SEO优化的关键:提升网站排名的秘籍(如何提高网站seo排名)

你是否曾经在搜索引擎上搜索过一个关键词,然后点击了排在前几位的网站?如果是,那么你已经体会到了SEO(搜索引擎优化)的威力。SEO是一项关键的网络营销策略,它能够让你的网站在搜索引擎中获得更高的排名&…

Apache ECharts

Apache ECharts介绍: Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。 官网地址:https://echarts.apache.org/zh/index.html Apache ECh…

Stable Diffusion写真完整教程

前言 最近自己对AI非常痴迷,并且今后也会一直在这个领域深耕,所以就想着先入门,因此花时间研究了一番,还好,出了点小成果,接下来给大家汇报一下。 AI绘画 提到AI绘画,大家可能立马会想到made…

模拟集成电路(3)----单级放大器(共源极)

模拟集成电路(3)----单级放大器(共源极) 放大是模拟电路的基本功能 大多数自然模拟信号太小而无法处理需要足够的信噪比 理想的放大器 线性:无限的幅度和频率范围 输入阻抗无限大 输出阻抗无限小 共源放大器 共源放大器就是将源极接A…

01面向类的讲解

指针指向类成员使用 代码&#xff1a; #include<iostream> using namespace std;class Test { public:void func() { cout << "call Test::func" << endl; }static void static_func();int ma;static int mb; //不依赖对象 }; void Test::static…

JavaScript 动态网页实例 —— 事件处理应用

前言 事件处理的应用很广泛。在事件处理的应用中,鼠标事件的应用是最常用到的。本章给出几个鼠标事件处理应用的示例,包括:页面预览、图像切换、点亮文本、鼠标跟随、鼠标感应和禁用鼠标按键。在这些示例中,有的可以直接拿来应用,有的则只提供了一种应用的方法,稍加拓展,…

示例十一、声音传感器

通过以下几个示例来具体展开学习,了解声音传感器原理及特性&#xff0c;学习声音传感器的应用&#xff08;干货版&#xff09;&#xff1a; 示例十一、声音传感器 ino文件源码&#xff1a; //Arduino C demo void setup() {Serial.begin(9600);pinMode(5, OUTPUT); }void loo…

【C/C++笔试练习】DNS设置文件、应用层、Dos攻击、DNS服务、DNS、子网划分、http状态、路由设置、TCP连接、HTTP状态码、剪花布条、客似云来

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;DNS设置文件&#xff08;2&#xff09;应用层&#xff08;3&#xff09;Dos攻击&#xff08;4&#xff09;DNS服务&#xff08;5&#xff09;DNS&#xff08;6&#xff09;子网划分&#xff08;7&#xff09;http状态&am…

docker01-简介和概述

什么是docker&#xff1f; 我们现在开发项目是在windows操作系统使用idea开发&#xff0c;本地windows操作系统上有我们项目所需的jdk&#xff0c;mysql&#xff0c;redis&#xff0c;tomcat等环境&#xff0c;如果我们想打包我们的项目到一个别的服务器上&#xff0c;在别的服…

SpringBoot实现图片验证码

引入依赖 <dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version> </dependency>代码实现 package com.qiangesoft.captcha.controller;import com.wf.captcha.*…

最少数量线段覆盖-华为OD

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布一些解题思路&#xff0c;希望大家多指教 一、题目描述 给定坐标轴上的一组线段&#xff0c;线段的起点和终点均为整数…

C++:类与对象—继承

类与对象—继承 一、继承是什么&#xff1f;二、继承定义三、基类和派生类对象赋值转换四、继承中的作用域五、派生类的默认成员函数六、继承与友元七、继承与静态成员八、复杂的菱形继承及菱形虚拟继承九、继承的总结和反思十、考察重点 一、继承是什么&#xff1f; 继承(inh…

Java的时间类

1. 日期类 1.1 第一代日期类 1) Date: 精确到毫秒&#xff0c;代表特定的瞬间 2) SimpleDateFormat: 格式和解析日期的类 SimpleDateFormat 格式化和解析日期的具体类。它允许进行格式化(日期-→>文本)、解析(文本->日期)和规范化. import java.text.ParseExce…