[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.pswp.cn/web/10462.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10462.shtml
英文地址,請注明出處:http://en.pswp.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…

A-loam建圖算法

A-LOAM構建3d點云地圖并實時轉存二維柵格地圖 A-loam算法。源代碼用的是velodyne雷達話題,但是現在用rslidar來處理。所以也會遇到另外一個包來轉換相關的數據。 git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.githttps://github.com/HViktorTsoi/r…

重慶市工程技術生態環境專業職稱申報條件

重慶市工程技術生態環境專業職稱申報條件鏈接重慶市人力資源和社會保障局 重慶市生態環境局關于印發重慶市工程技術生態環境專業職稱申報條件的通知_重慶市人力資源和社會保障局類別基本條件業績成果備注工程師具備博士學位;或具備碩士學位或第二學士學位&#xff0…

cin.ignore()函數和stoll函數

cin.ignore()函數 cin.ignore() 是一個非常實用的函數,主要用于控制輸入流 cin 的行為 cin.ignore(int n 1, char delimiter EOF); n:一個整數參數,表示要忽略的字符數量。默認值是1,意味著只忽略下一個字符。delimiter&#x…

Android 屏幕適配全攻略(下)-百變屏幕無壓力,這才是Android屏幕適配的終極解決方案

在上一篇文章中,我們介紹了Android屏幕適配的基本方法,比如使用限定符資源、圖片適配、矢量圖等。 感興趣的朋友,請前往查閱:Android 屏幕適配全攻略(中)-從九宮格到矢量圖,揭秘Android多屏幕適…

模擬集成電路(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…

機器學習-無監督學習

無監督學習是機器學習和人工智能的另一個重要分支&#xff0c;它主要處理沒有標簽的數據集&#xff0c;目的是發現數據中的隱藏模式、結構或異常。無監督學習不依賴于預先定義的輸出&#xff0c;而是讓算法自己揭示數據的本質特征。 無監督學習的過程通常包括以下幾個步驟&…

標準服務器控件

文本類型控件 通常指的是用于輸入或顯示文本的控件。 TextBox&#xff1a;這是最基本的文本輸入控件。它允許用戶在頁面上輸入文本。你可以設置它的屬性來控制其行為&#xff0c;如MaxLength&#xff08;限制輸入的最大字符數&#xff09;、ReadOnly&#xff08;是否只讀&…