如何使用CMake进行多组件QT项目

问题描述 投票:0回答:1

我在QT设计器中创建了项目。在设计师中我使用我自己的小部件

class DockWidget : public QDockWidget

但是在linux服务器中构建时我遇到了错误

dockwidget.h: No such file or directory

因为在构建过程中创建了临时文件夹,其中包含生成的 ui_mainwindow.h 文件

$ cmake --build $BUILD_DIR/$BUILD_TYPE
[  1%] Automatic MOC and UIC for target eda
[  1%] Built target eda_autogen
[  3%] Generating qrc_resources.cpp
[  5%] Generating qrc_qml.cpp
[  7%] Building CXX object CMakeFiles/eda.dir/eda_autogen/mocs_compilation.cpp.o
In file included from /home/gitlab-runner/builds/pNUPGYMp/0/cad/eda/build/Release/eda_autogen/DL2WFWMK6B/../../../../ui/view/mainmenu/mainmenu.h:6,
                 from /home/gitlab-runner/builds/pNUPGYMp/0/cad/eda/build/Release/eda_autogen/DL2WFWMK6B/moc_mainmenu.cpp:10,
                 from /home/gitlab-runner/builds/pNUPGYMp/0/cad/eda/build/Release/eda_autogen/mocs_compilation.cpp:17:
/home/gitlab-runner/builds/pNUPGYMp/0/cad/eda/build/Release/eda_autogen/include/ui/view/mainwindow/ui_mainwindow.h:24:10: fatal error: ../../components/dockwidgets/dockwidget.h: No such file or directory
 #include "../../components/dockwidgets/dockwidget.h"
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

文件dockwidget.h、mainwindow.ui 和mainwindow.h 位于不同的文件夹中。 我的项目结构是

ProjectFolder/
|_CMakeLists.txt
|_ui/
  |_CMakeLists.txt
  |_view/
  | |_CMakeLists.txt
  | |_mainwindow/
  |   |_CMakeLists.txt
  |   |_mainwindow.cpp
  |   |_mainwindow.h
  |   |_mainwindow.ui
  |_components/
    |_CMakeLists.txt
    |_dockwidgets/
      |_CMakeLists.txt
      |_dockwidget.h

我的环境有什么不正确的地方?

UPD:我的 CMakeLists.txt 是

cmake_minimum_required(VERSION 3.25)
set(PROJECT "myproj")
project(${PROJECT} LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_SOURCE_DIR})
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
SET(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
SET(CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR} ${CMAKE_PREFIX_PATH})

find_package(Qt5 COMPONENTS Widgets UiTools Quick Qml QuickWidgets OpenGL QuickControls2 REQUIRED)
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)

add_subdirectory(entities)
add_subdirectory(models)
add_subdirectory(ui)

qt5_add_resources(RSS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/ui/resources/resources.qrc)
qt5_add_resources(RSS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/ui/resources/qml.qrc)

add_executable(${PROJECT} ${SOURCE} ${HEADERS} ${RSS_SOURCES})
set_target_properties(${PROJECT} PROPERTIES AUTOMOC ON)
target_link_libraries(${PROJECT} PRIVATE Qt5::Widgets Qt5::UiTools Qt5::Qml Qt5::Quick Qt5::QuickWidgets ${QT_INTEGRATION_PLUGIN})
c++ qt cmake build moc
1个回答
0
投票

您遇到的错误是由于

ui_mainwindow.h
文件中的相对包含路径引起的,由于文件夹结构不同,该文件无法找到
dockwidget.h
文件。您需要调整项目的 CMakeLists.txt 以在包含路径中正确包含必要的目录。您可以使用
target_include_directories
命令将包含目录添加到 CMakeLists.txt。在您的情况下,您应该添加
components/dockwidgets
文件夹的包含目录,以便编译器可以找到
dockwidget.h
。以下是修改 CMakeLists.txt 的方法:

cmake_minimum_required(VERSION 3.25)
set(PROJECT "myproj")
project(${PROJECT} LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_SOURCE_DIR})
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
SET(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
SET(CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR} ${CMAKE_PREFIX_PATH})

find_package(Qt5 COMPONENTS Widgets UiTools Quick Qml QuickWidgets OpenGL QuickControls2 REQUIRED)
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)

add_subdirectory(entities)
add_subdirectory(models)
add_subdirectory(ui)

# Add include directory for the dockwidgets component
target_include_directories(${PROJECT} PRIVATE ${CMAKE_SOURCE_DIR}/components/dockwidgets)

qt5_add_resources(RSS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/ui/resources/resources.qrc)
qt5_add_resources(RSS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/ui/resources/qml.qrc)

add_executable(${PROJECT} ${SOURCE} ${HEADERS} ${RSS_SOURCES})
set_target_properties(${PROJECT} PROPERTIES AUTOMOC ON)
target_link_libraries(${PROJECT} PRIVATE Qt5::Widgets Qt5::UiTools Qt5::Qml Qt5::Quick Qt5::QuickWidgets ${QT_INTEGRATION_PLUGIN})

通过添加

target_include_directories(${PROJECT} PRIVATE ${CMAKE_SOURCE_DIR}/components/dockwidgets)
,您可以告诉 CMake 在编译 myproj 目标时包含 Components/dockwidgets 目录,这应该可以解决 dokwidget.h 包含错误。如有必要,请确保调整路径以匹配您的实际项目结构。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.