如何使用cmake强制UIC在源目录中生成ui_mainwindow.h

Posted

技术标签:

【中文标题】如何使用cmake强制UIC在源目录中生成ui_mainwindow.h【英文标题】:How to force UIC to generate ui_mainwindow.h in the source directory using cmake 【发布时间】:2020-02-14 17:47:23 【问题描述】:

UIC 成功创建了 ui_mainwindow.h 文件,但它存储在构建目录中。这会导致编译时错误“ui_mainwindow.h:未找到此类文件或目录”。

如果我在 build 目录中添加 ui_mainwindow.h 文件的完整路径,cmake (catkin_make) 会成功构建项目。显然我想避免在我的源代码中使用头文件的绝对路径。

我的 CMakeLists 的相关部分:

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

find_package(Qt5 REQUIRED COMPONENTS Widgets Core )
add_executable(monitor src/mainwindow.cpp src/main.cpp src/mainwindow.ui)
qt5_use_modules(monitor Widgets)

target_link_libraries(monitor Qt5::Core Qt5::Widgets $catkin_LIBRARIES $PCL_LIBRARIES $OpenCV_LIBRARIES $OpenCV_LIBS )

如何强制 UIC 在我的源目录中构建 ui_mainwindow.h 文件。或者如何在我的 CMakeLists.txt 中包含 cmake 构建目录

我试过了

qt5_wrap_ui (monitor_UI src/mainwindow.ui OPTIONS -o 'ui_mainwindow.h')
add_executable(monitor src/mainwindow.cpp src/main.cpp $monitor_UI)

没有成功。

【问题讨论】:

请注意,如果您将生成的文件放在源目录中,这有点破坏了拥有单独构建目录的全部意义。也许您应该做“正常”的事情并使用包含路径而不是进行这种不寻常的构建配置。 @hyde 我可以在包含路径中添加构建目录。是否有指向此构建目录的 cmake 变量,或者我必须使用 ../../.. .. /build 之类的东西? @hyde 感谢您的提示。我在包含路径中使用了 $CMAKE_CURRENT_BINARY_DIR。 【参考方案1】:

根据 hyde 的评论,我只是在 includepaths 中添加了 build 目录使用

include_directories(
  $CMAKE_CURRENT_BINARY_DIR
)

解决了我的问题。

【讨论】:

更好用cmake target_include_directories(monitor PRIVATE "$<BUILD_INTERFACE:$CMAKE_CURRENT_BINARY_DIR>" ) 【参考方案2】:

AUTOGEN_BUILD_DIR CMake 变量指定哪里 AUTOUIC 应该生成文件。如果你希望生成的文件放在你当前的源码目录下,可以设置为CMAKE_CURRENT_SOURCE_DIR

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(AUTOGEN_BUILD_DIR $CMAKE_CURRENT_SOURCE_DIR)

来自 CMake-Qt documentation 的关于将 AUTOUICAUTOGEN_BUILD_DIR 变量一起使用的附加说明:

生成的ui_*.h 文件放在<AUTOGEN_BUILD_DIR>/include 目录中,该目录会自动添加到目标的INCLUDE_DIRECTORIES

因此,您应该不必include_directories() 命令中明确列出包含生成的标头的目录。

【讨论】:

我试过了,但它仍然在构建目录中生成头文件 您是否尝试过从 scratch 运行 CMake?通过删除构建文件夹,或删除 CMakeCache.txt 文件? @ShawnMathew 我同意生成的头文件应该放在你的 binary 目录中的某个地方,但你仍然可以使用AUTOGEN_BUILD_DIR 来控制位置。我扩展了我的答案以解释为什么在使用这种方法时不需要include_directories()。很高兴你让它工作了! 我删除了构建目录并再次运行cmake(catkin_make)但没有成功。我在任何地方都没有看到新的包含目录,但仍然出现同样的错误。

以上是关于如何使用cmake强制UIC在源目录中生成ui_mainwindow.h的主要内容,如果未能解决你的问题,请参考以下文章

在CMake中生成命令后执行命令

CMake中生成的文件的运行时依赖关系

如何强制数据透视表中生成的值采用特定格式(Aspose Cells)?

有可能不在cmake中生成ALL_BUILD项目吗?

编译器显示错误消息“从不强制转换的整数中生成指针”(反转数组)。我该如何解决这个问题? [关闭]

如何强制 CMake 使用系统上安装的特殊版本的 Protobuf?