如何使用AUTOUIC添加的包含目录可用于下游目标?

时间:2017-06-25 12:19:31

标签: c++ qt cmake

我的qt项目中有一个CMake的AUTOUIC选项有问题。

我有一个具有* .ui qt-form文件的目标,并将其更改为使用AUTOUIC选项自动生成相应的ui _ * .h文件,并将其位置添加到目标的include目录中。

问题是,我将生成的“ui _ * .h”文件包含在目标的标题中,然后将其包含在另一个测试目标中。但是,测试目标没有将生成的文件设置为其include目录的目录,因此找不到ui _ * .h文件。

那么有没有办法获取生成的文件的目录,所以我可以将它添加到我的第一个目标的INTERFACE_INCLUDE_DIRECTORIES。当我使用硬编码名称执行此操作时它解决了我的编译错误,但我宁愿通过从某个目标属性中获取该目录来实现此目的。我失败了,因为AUTOUIC包括dirs似乎只在处理完所有CMakeLists文件后添加。

顺便说一下,我目前正在使用CMake 3.8.2,但如果问题已经解决,可以选择更新到3.9。

2 个答案:

答案 0 :(得分:1)

我有同样的问题 - 它看起来像CMAKE中的一个错误(我使用的是版本3.10 rc5) 并在此处向CMAKE开了一个错误报告:https://gitlab.kitware.com/cmake/cmake/issues/17456

在此期间,您可以在运行autouic后使用以下命令将自动生成的头文件复制到项目源目录。

SET(AUTOGEN_BUILD_DIR "${CMAKE_BUILD_DIR}/<project>_autogen/include_${CONFIG}") 
file(COPY "${AUTOGEN_BUILD_DIR}/ui_xxxx.h" DESTINATION "${CMAKE_SOURCE_DIR}/headers")

其中$ {CONFIG}是构建类型(调试/发布)

答案 1 :(得分:1)

从CMake 3.9版开始,您可以使用以下代码段将自动生成的标头添加到目标的构建接口包括目录:

get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(_isMultiConfig)
  set(AUTOGEN_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}_autogen/include_$<CONFIG>)
else()
  set(AUTOGEN_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}_autogen/include)
endif()

target_include_directories(${TARGET_NAME} INTERFACE
  $<BUILD_INTERFACE:${AUTOGEN_INCLUDE_DIR}>
)

请参阅: