Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake qt:包括来自同级项目的自动生成文件。如何做对?_Qt_Cmake - Fatal编程技术网

CMake qt:包括来自同级项目的自动生成文件。如何做对?

CMake qt:包括来自同级项目的自动生成文件。如何做对?,qt,cmake,Qt,Cmake,commonLib是一组文件,用于兄弟文件夹中声明的其他一些目标,然后通过add_子目录()将这些目标添加到父CMakeLists.txt。commonLib包含foo.h和foo.ui(由AUTOUIC翻译成ui_foo.h) otherLib包括commonLib中的foo.h 我觉得我错过了一些明显的东西 有必要使用像target\u link\u库这样的东西吗? 我可以将commonLib的autogen文件夹添加到otherLib的include文件夹中吗?(带有目标目录(common

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

otherLib包括commonLib中的foo.h

我觉得我错过了一些明显的东西

有必要使用像target\u link\u库这样的东西吗? 我可以将commonLib的autogen文件夹添加到otherLib的include文件夹中吗?(带有目标目录(commonLib PRIVATE${AUTOGEN_FOLDER_OF_otherLib}))

如何确保commonLib在其他Lib之前自动生成

请让我知道是否缺少了解问题的信息

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

我假设通过使用目标属性(如: *自动生成目标取决于 *自动生成生成目录

但我失败了

commonLib包含以下代码:

find_package(Qt5 REQUIRED COMPONENTS Widgets)
set_target_properties(${PROJECT_NAME} PROPERTIES
    AUTOUIC ON
)
add_dependencies(${PROJECT_NAME}
    commonLib
)
otherLib包含以下代码:

find_package(Qt5 REQUIRED COMPONENTS Widgets)
set_target_properties(${PROJECT_NAME} PROPERTIES
    AUTOUIC ON
)
add_dependencies(${PROJECT_NAME}
    commonLib
)
我希望CMake能够成功地从commonLib生成ui_foo.h(它实际上是在commonLib_autogen/include_文件夹中生成的),然后使用ui_foo.h与其他库进行编译

产生的错误消息是:

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]

问题在于使用

#包括“ui_foo.h”

在标题中(foo.h)。将include移动到foo.cpp文件并向前声明
Ui::FooBar
,如下所示:

namespace Ui{class FooBar;}


解决了它。

我刚刚找到了一种方法,但我很确定这不是一种最佳实践方法:在ProjectB中,向源代码中添加
cmake${cmake\u CURRENT\u SOURCE\u DIR}/./projectA/foo.h
,编译结果没有错误。有更好的方法吗?CMake既不能调整项目之间的依赖关系,也不能调整目录之间的依赖关系。只有目标和文件可以是依赖关系图的一部分。假设
ProjectA
是某个目标,它依赖于
ui\u foo.h
文件,构建该目标将创建该文件,
add\u dependencies(ProjectB ProjectA)
将在构建目标
ProjectB
时强制执行文件的现有属性。指定
add_executable(ProjectB)
也可以。非常感谢您花时间向我解释这一点!:)我将调整命名以避免误解。Project*是添加到父文件夹中CMakeLists.txt的子文件夹。他们是自己的目标。但我的错误完全不同。我没有激活依赖目标的AUTOMOC,这似乎是在构建依赖目标时生成ui_foo.h(从第一个目标)所必需的。经验教训:更准确地使用词汇/关键词,避免歧义。