Visual studio Can';t使用CMake';包含链接库中的ui文件;s autouic

Visual studio Can';t使用CMake';包含链接库中的ui文件;s autouic,visual-studio,qt,cmake,Visual Studio,Qt,Cmake,我有一个CMake项目,我简化了它以找到错误的根源。 该项目只有一个CMakeLists.txt文件,其中添加了一个库和一个链接到库的可执行文件。 库和可执行文件都包含ui文件。为了生成ui文件的头文件,使用变量CMAKE\u AUTOUIC。 库和可执行文件都能够包含它们自己的ui文件:它们位于我的构建目录的子目录[projectname]\u autogen\include\u Debug中。 但是,我的可执行文件中的另一个文件包含库中的一个文件,而库中又包含一个ui文件。这里我得到了一个错

我有一个CMake项目,我简化了它以找到错误的根源。 该项目只有一个CMakeLists.txt文件,其中添加了一个库和一个链接到库的可执行文件。 库和可执行文件都包含ui文件。为了生成ui文件的头文件,使用变量
CMAKE\u AUTOUIC
。 库和可执行文件都能够包含它们自己的ui文件:它们位于我的构建目录的子目录
[projectname]\u autogen\include\u Debug
中。 但是,我的可执行文件中的另一个文件包含库中的一个文件,而库中又包含一个ui文件。这里我得到了一个错误:

Error   C1083   Cannot open include file: 'ui_MainWidget.h': No such file or directory  QtGUI
\QtGUI\src\QtWidgets\include\MainWidget.h   5
我的项目如下所示:

cmake_minimum_required (VERSION 3.14 FATAL_ERROR)

project(QtGUI)

find_package(Qt5 COMPONENTS Widgets Core Gui REQUIRED)

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

add_library(QtWidgets
    QtWidgets/source/MainWidget.cpp
    QtWidgets/include/MainWidget.h
    QtWidgets/include/MainWidget.ui
)
target_link_libraries(QtWidgets
    PUBLIC
        Qt5::Widgets
        Qt5::Core
        Qt5::Gui
)
target_include_directories(QtWidgets
    PUBLIC
        QtWidgets/include
)

add_executable(${PROJECT_NAME}
    Main/include/MainWindow.h
    Main/include/MainWindow.ui
    Main/source/MainWindow.cpp
    Main/source/Main.cpp
)
target_link_libraries(${PROJECT_NAME}
    PUBLIC
        QtWidgets
)
target_include_directories(${PROJECT_NAME}
    PUBLIC
        Main/include
)
以及项目
QtGUI
中的
MainWindow.cpp
文件,其中出现错误:

#include "MainWindow.h" // inside this project
#include "MainWidget.h" // inside the linked library 'QtWidgets'

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{ 
...
MainWidget.h
如下所示

// Qt Includes
#include <ui_MainWidget.h> // inside this project
#include <QWidget>

namespace Ui
{
    class MainWidget;
}

class MainWidget : public QWidget
{
    Q_OBJECT

public:
...

//Qt包括
#将//包含在此项目中
#包括
名称空间用户界面
{
类MainWidget;
}
类MainWidget:publicqwidget
{
Q_对象
公众:
...
我错过了什么? 我知道拆分CMakeLists.txt并在链接库中拥有自己的CMakeLists.txt,然后将
add_library
内容移动到那里(并对可执行文件执行相同的操作,例如
应用程序
-目录),会更干净,但我认为这个示例更容易理解结构

编辑/添加

我回到这个(不幸的是没有回答)问题,并发现了这个问题:查看我的QtGUI项目(可执行文件)的“配置属性->C/C++->其他包含目录”,我看到了以下内容:

  • QtGUI\build\QtGUI\u autogen\include\u Debug
  • QtGUI\src\Main\include
  • QtGUI\src\QtWidgets\include
还有一些

但所需的
ui\u MainWidget.h
位于
QtGUI\build\qtwidkets\u autogen\include\u Debug
内,该目录未设置为附加包含目录。 我手动添加,一切正常

我需要如何修改CMakeLists.txt文件,以便为我的其他包含目录自动设置此目录?


PS:我也检查了配置,但找不到任何相关的差异。

经过进一步挖掘,我意识到AUTOUIC目标属性的设计方式,CMake正在特定目录中查找生成的UI头文件。这些目录会自动添加到目标的INCLUDE_目录中,其中如上文所述,包括调试。 这仅针对每个目标而不是跨目标执行

一个选项是将目标属性
AUTOGEN\u BUILD\u DIR
设置为无需任何特殊字符串即可轻松包含的目录:

set_target_properties(QtWidgets
                      PROPERTIES AUTOGEN_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
然而,这种方法的问题是,我有两个目标,因此
mocs_compilation.cpp
将都放在同一个目录中,因此其中一个被覆盖。最后,我不得不做如下操作

set_target_properties(${PROJECT_NAME}
                      PROPERTIES AUTOGEN_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/QtWidgets")
这使得整个事情变得多余

回答我最近编辑的关于如何包括其他目标autogen include目录的问题:
$
可在
QtGUI
-target的
target\u include\u目录中使用,这会导致

target_include_directories(${PROJECT_NAME}
    PUBLIC
        Main/include
    $<$<CONFIG:DEBUG>:${CMAKE_CURRENT_BINARY_DIR}/QtWidgets_autogen/include_Debug>
    $<$<CONFIG:RELEASE>:${CMAKE_CURRENT_BINARY_DIR}/QtWidgets_autogen/include_Release>
)
target\u include\u目录(${PROJECT\u NAME}
公开的
主要/包括
$
$
)
此外,可以将代码更改为使用经典的
qt5_-wrap_-ui
qt5_-wrap_-cpp
方法,将生成的ui头文件放入我的
QtGUI\build
目录中

编辑/添加

查看QtGUI项目(可执行文件)的“配置属性->C/C++->其他包含目录”,我现在可以看到以下内容:

  • QtGUI\build\QtGUI\u autogen\include\u Debug
  • QtGUI\src\Main\include
  • QtGUI\build\QtWidgets\u autogen\include\u Debug
  • QtGUI\src\QtWidgets\include
还有一些