Visual studio Can';t使用CMake';包含链接库中的ui文件;s autouic
我有一个CMake项目,我简化了它以找到错误的根源。 该项目只有一个CMakeLists.txt文件,其中添加了一个库和一个链接到库的可执行文件。 库和可执行文件都包含ui文件。为了生成ui文件的头文件,使用变量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\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
还有一些