首页 > 解决方案 > CMake-qt:包括来自同级项目的自动生成文件。怎么做才对?

问题描述

commonLib 是用于在兄弟文件夹中声明的其他一些目标的文件集合,然后通过 add_subdirectory() 添加到父 CMakeLists.txt。commonLib 包含 foo.h 和 foo.ui(由 AUTOUIC 翻译成 ui_foo.h)

otherLib 包括来自 commonLib 的 foo.h。

感觉就像我错过了一些明显的东西。

是否有必要使用类似 target_link_libraries 的东西?我可以将 commonLib 的 autogen 文件夹添加到 otherLib 的包含文件夹中吗?(与 target_include_directories(commonLib PRIVATE ${AUTOGEN_FOLDER_OF_otherLib}) )

如何确保 commonLib 在 otherLib 之前自动生成?

如果缺少用于理解问题的信息,请告诉我。

我正在使用 cmake-converter 将现有的 .sln 文件转换为 CMakeLists.txt。

我假设使用以下目标属性会成功:* AUTOGEN_TARGET_DEPENDS * AUTOGEN_BUILD_DIR

但我失败了。

commonLib 包含以下代码:

find_package(Qt5 REQUIRED COMPONENTS Widgets)
set_target_properties(${PROJECT_NAME} PROPERTIES
    AUTOUIC ON
)

otherLib 包含以下代码:

add_dependencies(${PROJECT_NAME}
    commonLib
)

我希望 CMake 能够从 commonLib 成功生成 ui_foo.h(它实际上是在文件夹 commonLib_autogen/include_ 中生成的),然后使用 ui_foo.h 与 otherLib 进行编译。

产生的错误消息是:

d:\path\to\otherLib\../otherLib/foo.h(6): fatal error C1083: Cannot open include file: 'ui_foo.h': No such file or directory [D:\build_dir_of\otherLib\otherLib.vcxproj]

标签: qtcmake

解决方案


问题是使用

# include "ui_foo.h"

在标题(foo.h)中。将包含移动到 foo.cpp 文件并转发声明Ui::FooBar如下:

namespace Ui { class FooBar; }

解决了它。


推荐阅读