解决cmake编译时*ui,*h存放在不同文件夹下时*.ui无法生成ui_*.h问题

使用的Qt版本为6.8.1, cmake版本为3.31.0-rc1

遇到问题原因

原本的目录结构比较乱,代码文件一多就很不好找,在对文件进行分类管理的过程中发现*ui文件无法生成ui_*.h

有问题部分的cmake

本来想使用qt_wrap_uiset(CMAKE_AUTOUIC ON)让他自动生成ui_*.h的,但是失败了

cmake_minimum_required(VERSION 3.16)
project(Usim LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_VERBOSE_MAKEFILE ON)

set(CMAKE_PREFIX_PATH "D:/Qt/Qt6.8.1/6.8.1/msvc2022_64")    

find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Charts)
qt_standard_project_setup()

set(SOURCE_DIR ${PROJECT_SOURCE_DIR}/src)
set(MOUDLE_DIR ${SOURCE_DIR}/moudle)
set(UI_DIR ${PROJECT_SOURCE_DIR}/ui)
set(INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include)
set(VTK_DIR "C:/Program Files (x86)/VTK/include/vtk-9.4")
include_directories(${UI_DIR} ${VTK_DIR} ${SOURCE_DIR} ${INCLUDE_DIR} ${MOUDLE_DIR})

# 处理 .ui 文件
file(GLOB UI_FILES ${UI_DIR}/*.ui)
qt_wrap_ui(UI_HEADERS ${UI_FILES})
message(STATUS "UI_HEADERS: "${UI_HEADERS})

# 处理源文件和头文件
file(GLOB PROJECT_SOURCES 
    ${SOURCE_DIR}/main.cpp
)

file(GLOB MOUDLE_SOURCES 
    ${MOUDLE_DIR}/*.cpp
    ${INCLUDE_DIR}/*.h
)
list(APPEND PROJECT_SOURCES ${UI_HEADERS} ${MOUDLE_SOURCES})

正确的完整cmake写法

使用list(APPEND CMAKE_AUTOUIC_SEARCH_PATHS ${UI_DIR})替换file(GLOB UI_FILES ${UI_DIR}/*.ui)qt_wrap_ui(UI_HEADERS ${UI_FILES})即可。

cmake_minimum_required(VERSION 3.16)
project(Usim LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_PREFIX_PATH "D:/Qt/Qt6.8.1/6.8.1/msvc2022_64")
set(CMAKE_AUTOUIC ON)

set(VERSION_MAJOR 2)
set(VERSION_MINOR 0)
set(VERSION_PATCH 1)

find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Charts)
qt_standard_project_setup()

# 设置源文件、头文件、ui文件路径
set(SOURCE_DIR ${PROJECT_SOURCE_DIR}/src)
set(SOURCE_MOUDLE_DIR ${SOURCE_DIR}/moudle)
set(SOURCE_UI_DIR ${SOURCE_DIR}/ui)
set(UI_DIR ${PROJECT_SOURCE_DIR}/ui)
set(INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include)
set(VTK_DIR "C:/Program Files (x86)/VTK/include/vtk-9.4")
include_directories(${UI_DIR} ${VTK_DIR} ${SOURCE_DIR} ${INCLUDE_DIR} ${SOURCE_MOUDLE_DIR} ${SOURCE_UI_DIR})
file(GLOB PROJECT_SOURCES 
    ${SOURCE_DIR}/main.cpp
    ${SOURCE_MOUDLE_DIR}/*.cpp
    ${SOURCE_UI_DIR}/*.cpp
)
file(GLOB INCLUDE_SOURCES 
    ${INCLUDE_DIR}/*.h
)
list(APPEND CMAKE_AUTOUIC_SEARCH_PATHS ${UI_DIR})
list(APPEND PROJECT_SOURCES ${INCLUDE_SOURCES})
add_executable(${PROJECT_NAME} ${PROJECT_SOURCES})

# 设置 CGNS 库
if(CMAKE_BUILD_TYPE MATCHES "Debug")
    set(CGNS_LIB_PATH "${PROJECT_SOURCE_DIR}/libs/debug")
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
    set(CGNS_LIB_PATH "${PROJECT_SOURCE_DIR}/libs/release")
endif()
set(CGNS_LIBS 
    cgns libhdf5 libszip libzlib
)
foreach(cgns_lib ${CGNS_LIBS})
    add_library(${cgns_lib} STATIC IMPORTED)
    set_target_properties(${cgns_lib} PROPERTIES IMPORTED_LOCATION "${CGNS_LIB_PATH}/${cgns_lib}.lib")
endforeach()

# 设置 VTK 库
set(VTK_LIB_PATH "C:/Program Files (x86)/VTK/lib")
set(VTK_LIBS
    vtksys-9.4 vtkImagingCore-9.4 vtkIOImage-9.4 vtkGUISupportQt-9.4
    vtkCommonCore-9.4 vtkCommonDataModel-9.4 vtkCommonExecutionModel-9.4
    vtkFiltersCore-9.4 vtkFiltersGeneral-9.4 vtkFiltersGeometry-9.4 vtkFiltersModeling-9.4 vtkFiltersSources-9.4
    vtkRenderingCore-9.4 vtkRenderingAnnotation-9.4 vtkRenderingContext2D-9.4 vtkRenderingOpenGL2-9.4
    vtkInteractionStyle-9.4 vtkInteractionWidgets-9.4 vtkInteractionImage-9.4
)
if(CMAKE_BUILD_TYPE MATCHES "Debug")
    set(VTK_LIBS_DEBUG "")
    foreach(lib ${VTK_LIBS})
        list(APPEND VTK_LIBS_DEBUG "${lib}d")
    endforeach()
    set(VTK_LIBS ${VTK_LIBS_DEBUG})
endif()
foreach(vtk_lib ${VTK_LIBS})
    add_library(${vtk_lib} STATIC IMPORTED)
    set_target_properties(${vtk_lib} PROPERTIES IMPORTED_LOCATION "${VTK_LIB_PATH}/${vtk_lib}.lib")
endforeach()

# 链接库
target_link_libraries(${PROJECT_NAME}
    PUBLIC
        Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Charts
        ${CGNS_LIBS}
        ${VTK_LIBS}
)

# 定义翻译文件
set(TRANSLATIONS
    "${PROJECT_SOURCE_DIR}/translations/zh_CN.ts"
)
find_program(LUPDATE_EXECUTABLE lupdate)
find_program(LRELEASE_EXECUTABLE lrelease)
foreach(_ts_file ${TRANSLATIONS})
    execute_process(COMMAND ${LUPDATE_EXECUTABLE} -recursive ${CMAKE_SOURCE_DIR} -ts ${_ts_file})
    execute_process(COMMAND ${LRELEASE_EXECUTABLE} ${_ts_file})
endforeach()

# 资源文件
qt_add_resources(PROJECT_SOURCES resources/Resource.qrc)

# 生成的是windows下的可执行文件
set_target_properties(${PROJECT_NAME}
    PROPERTIES
        WIN32_EXECUTABLE TRUE
)
posted @   sleeeeeping  阅读(108)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
  1. 1 吹梦到西洲 恋恋故人难,黄诗扶,妖扬
  2. 2 敢归云间宿 三无Marblue
敢归云间宿 - 三无Marblue
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

敢归云间宿 - 三无Marblue

词:怀袖

曲:KBShinya

编曲:向往

策划:杨颜

监制:似雨若离RainJaded/杨颜

吉他:大牛

混音:三无Marblue

和声:雾敛

母带:张锦亮

映像:似雨若离RainJaded

美术:阿尼鸭Any-a/乙配/雨谷/今风/米可/Eluan

题字:长安

酒 泼去群山眉头

酒 泼去群山眉头

月 悬在人世沧流

空杯如行舟 浪荡醉梦里走

心 生自混沌尽头

心 生自混沌尽头

对 天地自斟自酬

诗随我 遍历春秋

行流水 走笔形生意动

见珠玉 淙淙落纸成诵

拾得浮名有几声 云深处 却空空

耳畔丝竹 清商如雾

谈笑间 却是心兵穷途

飞觞醉月无归宿 便是孤独

不如就化身为风

卷狂沙 侵天幕

吹醒那 泉下望乡 的战骨

昨日边关犹灯火

眼前血海翻覆

千万人跌落青史 隔世号呼

于是沸血重剑共赴

斩以雷霆之怒

肩背相抵破阵开路

万古同歌哭

纵他春风不度 悲欢蚀骨

此去宁作吾

挣过命途 才敢写荣枯

望 云际群龙回首

望 云际群龙回首

任 飘蓬争逐身后

叹冥顽之俦 好景尽付恩仇

收 江声随酒入喉

收 江声随酒入喉

来 提笔御风同游

不觉已 换了春秋

真亦假 泼墨腾烟沉陆

有还无 蝶影纷堕幻目

我与天地周旋久

写尽梦 便成梦

夜雨浇熄 往事残烛

生死间 谁尽兴谁辜负

管他醒来归何处 心生万物

也曾对电光火雨

抛酒樽 镇天枢

护住了 人间多少 朝与暮

烧尽了阴云冥府

烧尽了阴云冥府

且看星斗尽出

浩荡荡尘埃野马 忘怀命数

于是信步鸿蒙之轻

也领苍生之重

与诗与剑颠倒与共

沉眠斜阳中

纵他世事汹涌 万类争渡

此去宁作吾

醉得糊涂 才梦得清楚

潮水 带着叹息轻抚

潮水 带着叹息轻抚

像光阴 漫过大地上幽微草木

有情世 见众生明灭往复

天生自在 何必回顾

晦暗中双掌一拊

立此身 照前路

与某个 阔别的我 决胜负

渺渺兮身外无物

无喜无悲无怖

不过是大梦一场 各自沉浮

于是纵横万相穷通

也守心底灵通

合眼识得星沉地动

也岿然不动

敢令岁月乌有 逍遥长驻

敢归云间宿

遥祝远行人 有道不孤

点击右上角即可分享
微信分享提示