我在QT设计器中创建了项目。在设计师中我使用我自己的小部件
class DockWidget : public QDockWidget
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})
您遇到的错误是由于
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 包含错误。如有必要,请确保调整路径以匹配您的实际项目结构。