CMake安装依赖项

时间:2015-10-09 13:40:33

标签: cmake

我目前想用cmake创建一个安装程序,但不要自己将所有必需的DLL添加到CMakeLists.txt。因此,一个解决方案应该是使用fixup_bundle,如here建议的那样,所以希望他能复制所有DLL,他可以使用依赖性walker检测并且正在路径上。

但目前我不知道如何在目标上使用它的最佳方式,因为他不会解决TARGET_FILE_DIR,就像你使用add_custom_command一样。通过get_property读取位置也不会起作用,因为他在执行时不再知道目标。有什么想法吗?

INSTALL(CODE "
   include(BundleUtilities)
   fixup_bundle($<TARGET_FILE_DIR:${PROJECT_NAME}>   \"\"   \"D:\\Qt\")
   " COMPONENT Runtime
)

1 个答案:

答案 0 :(得分:0)

如果您使用的是Qt4,而不是直接使用BundleUtilities,那么最好使用DeployQt4模块。它包括以下三个可能满足您需求的命令:

  • install_qt4_plugin_path
  • install_qt4_plugin
  • install_qt4_executable

如果你使用Qt5,它会变得有点棘手。如果您只对Windows和/或Mac感兴趣,那么Qt本身就提供了一个适当的工具来处理/引入Qt的依赖关系。相关工具分别称为windeployqtmacdeployqt。可悲的是,在撰写本文时,还没有我所知道的linuxdeployqt工具。

如果以上两个选项都不对你开放或者没有做你需要的,那么至少DeployQt4模块提供了一些线索,告诉你如何能够像你尝试的那样使用INSTALL(...)命令至。 DeployQt4模块使用以下命令来定义其目标(请参阅DeployQt4.cmake文件末尾附近):

FIXUP_QT4_EXECUTABLE(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${executable}\" \"\" \"${libs}\" \"${dirs}\" \"${plugins_dir}\" \"${request_qt_conf}\")"
                ${component}
        )

${executable}前面的东西可能就是你遗漏的东西。在您的情况下,如果没有看到完整的CMakeLists.txt文件,我只能假设您有一个目标并且它与您的项目具有相同的名称(因为您在尝试的生成器表达式中使用了$ {PROJECT_NAME})。您可以尝试以下内容(未经测试):

INSTALL(CODE "
   include(BundleUtilities)
   fixup_bundle(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${MyTarget}\"   \"\"   \"D:\\Qt\")
   " COMPONENT Runtime
)

其中MyTarget是目标可执行文件的名称(如果你在Windows上,我认为没有任何.exe后缀)。在制作包时需要DESTDIR部分,因为CMake将通过设置DESTDIR环境变量(至少使用一些CMake生成器)来重定向安装位置。 CMAKE_INSTALL_PREFIX部分是安装应用程序的路径。有some history behind this,但上面反映了如何引用已安装的可执行文件的正确方法。