我正在为工作中的大型项目编写用于自定义GUI控件的QML插件/模块。我们使用CMake进行项目建设。 QML模块的主要结构(编译后)必须是这样的:
MyModule
myplugin.dll
control1.qml
control2.qml
…
最重要的是,所有qml文件和共享库插件(在示例中为myplugin.dll)必须放在模块名称为EXACTLRY的目录中(在示例中为MyModule)。作为构建后的步骤,所有qml文件都将复制到此二进制输出目录中。
这是问题所在:编译的二进制文件(在示例中为myplugin.dll)放置在输出目录中的目录Debug
,Release
等中。因此,结果类似于:MyModule/Debug/myplugin.dll
-模块不起作用。我尝试过操纵RUNTIME_OUTPUT_DIRECTORY_DEBUG
,RUNTIME_OUTPUT_DIRECTORY_RELEASE
以及所有混乱的动物园,但是……这不是一个选择,因为据我所知,build-config类型可以自定义,所以我无法预见所有可能的情况。并预先指定RUNTIME_OUTPUT_DIRECTORY_
个变体。
在这些Debug
,Release
,ConfigIDontKnowAboutYet
中是否有任何正常的方法来构造我的输出目录?例如,与其使它像这样:MyModule/Debug/myplugin.dll
-而是将其变成这样:MyModule/Debug/MyModule/myplugin.dll
–因为路径的最后一部分必须恰好是.../MyModule/myplugin.dll
,否则它将不起作用。如果没有这种方法,人们将如何处理?
另一个重要的事情是add_subdirectory()
应该将此模块用于更大的项目。 Debug
– Release
-MyOwnConfig
的混乱使一切变得更加困难。
到目前为止,找到的唯一或多或少的解决方案是将生成的MyModule的qml文件和qml文件install()
放入包含MyModule作为依赖项的较大项目的二进制输出目录中。但是,还有另一个问题。事实证明,在这种情况下,我必须安装MyModule两次:一次进入大型项目的二进制输出目录以构建/测试/运行它,第二次安装大型项目本身。
我非常感谢任何建议。另外,如果某人有一个使用CMake,C ++的大型项目并且依赖QML模块,那么如果他们提供了链接以供查看,我将不胜感激。谢谢。
答案 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_directories
或link_directories
之类的内容)。
对于QML文件处理,最有可能采用非常相似的语法执行相同的操作。 QT使开发人员可以在CMake和QMake之间进行选择,因此他们可能有一种这样做的机制。
另外,请记住,C ++代码中QML文件的路径必须反映最终的项目结构。