CMake-输出目录结构和QML模块

时间:2019-07-09 09:56:17

标签: c++ qt cmake qml

我正在为工作中的大型项目编写用于自定义GUI控件的QML插件/模块。我们使用CMake进行项目建设。 QML模块的主要结构(编译后)必须是这样的:

MyModule myplugin.dll control1.qml control2.qml …

最重要的是,所有qml文件和共享库插件(在示例中为myplugin.dll)必须放在模块名称为EXACTLRY的目录中(在示例中为MyModule)。作为构建后的步骤,所有qml文件都将复制到此二进制输出目录中。

这是问题所在:编译的二进制文件(在示例中为myplugin.dll)放置在输出目录中的目录DebugRelease等中。因此,结果类似于:MyModule/Debug/myplugin.dll-模块不起作用。我尝试过操纵RUNTIME_OUTPUT_DIRECTORY_DEBUGRUNTIME_OUTPUT_DIRECTORY_RELEASE以及所有混乱的动物园,但是……这不是一个选择,因为据我所知,build-config类型可以自定义,所以我无法预见所有可能的情况。并预先指定RUNTIME_OUTPUT_DIRECTORY_个变体。

在这些DebugReleaseConfigIDontKnowAboutYet中是否有任何正常的方法来构造我的输出目录?例如,与其使它像这样:MyModule/Debug/myplugin.dll-而是将其变成这样:MyModule/Debug/MyModule/myplugin.dll –因为路径的最后一部分必须恰好是.../MyModule/myplugin.dll,否则它将不起作用。如果没有这种方法,人们将如何处理?

另一个重要的事情是add_subdirectory()应该将此模块用于更大的项目。 DebugRelease-MyOwnConfig的混乱使一切变得更加困难。

到目前为止,找到的唯一或多或少的解决方案是将生成的MyModule的qml文件和qml文件install()放入包含MyModule作为依赖项的较大项目的二进制输出目录中。但是,还有另一个问题。事实证明,在这种情况下,我必须安装MyModule两次:一次进入大型项目的二进制输出目录以构建/测试/运行它,第二次安装大型项目本身。

我非常感谢任何建议。另外,如果某人有一个使用CMake,C ++的大型项目并且依赖QML模块,那么如果他们提供了链接以供查看,我将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

CMake提供了在编译后安装文件的可能性。效果类似于make install命令。使用此命令,您可以选择安装构建的全部或仅特定产品。以下是我在CMakeLists.txt中使用的示例。

# The installation is prepended by the CMAKE_INSTALL_PREFIX variable
install(TARGETS ${CMAKE_PROJECT_NAME}
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    PUBLIC_HEADER DESTINATION include
)

这将复制您的产品,具体取决于它们的文件类型。但是您仍然需要设置库/包含路径。为此,我建议编译几个目标,并将第一个目标的安装目标用作lib / inc路径(最有可能附加,并带有include_directorieslink_directories之类的内容)。

对于QML文件处理,最有可能采用非常相似的语法执行相同的操作。 QT使开发人员可以在CMake和QMake之间进行选择,因此他们可能有一种这样做的机制。

另外,请记住,C ++代码中QML文件的路径必须反映最终的项目结构。