linux – 如何使用CPack以特定方式为QT应用程序打包依赖项?

前端之家收集整理的这篇文章主要介绍了linux – 如何使用CPack以特定方式为QT应用程序打包依赖项?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的QT项目.我正在 Linux上开发.但它最终要部署到Linux,Mac和Windows.

我正在尝试打包它以便分发.我遇到了查找依赖项并将其打包并以惯用方式执行此操作的问题(IOW:没有硬编码的DLL路径或包含我的源代码库中的DLL)

对于Windows端口,我正在使用MinGW并进行如下编译:

  1. mingw64-cmake -G "Unix Makefiles" .. -DCMAKE_INSTALL_PREFIX=../install -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=/usr/share/mingw/toolchain-mingw64.cmake
  2. make && ctest && make install && cpack -G "TGZ" && cpack -G "NSIS64"

我已将其设置为生成tar.gz文件和NSIS安装程序.目前没有特别的理由让NSIS而不是Wix.这只是为了解决问题.

它编译Windows可执行文件,但它不包括运行该程序所需的DLL.就是这些:

  1. Libgcc_s_seh-1.dll
  2. Qt5Core.dll
  3. Qt5Gui.dll

在我的计算机上快速查找显示这些DLL存在于此处:

  1. /usr/x86_64-w64-mingw32/sys-root/mingw/bin/Qt5Widgets.dll
  2. /usr/x86_64-w64-mingw32/sys-root/mingw/bin/libgcc_s_seh-1.dll
  3. ...

有没有办法自动让CPack挖掘DLL并将它们包含在安装程序中?

这是我的CMakeLists.txt文件

  1. cmake_minimum_required(VERSION 2.8.11)
  2.  
  3. project(myapp)
  4.  
  5. enable_testing()
  6.  
  7. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  8. set(CMAKE_AUTOMOC ON)
  9. set(CMAKE_AUTOUIC ON)
  10. set(CMAKE_AUTORCC ON)
  11. set(CMAKE_POSITION_INDEPENDENT_CODE ON)
  12.  
  13. find_package(Qt5Core required)
  14. find_package(Qt5Gui required)
  15. find_package(Qt5Widgets required)
  16.  
  17. add_executable(myapp WIN32 main.cpp mainwindow.cpp resources.qrc)
  18.  
  19. target_link_libraries(myapp Qt5::Widgets)
  20. target_link_libraries(myapp Qt5::Core)
  21. target_link_libraries(myapp Qt5::Gui)
  22.  
  23. INSTALL(TARGETS myapp
  24. BUNDLE DESTINATION .
  25. RUNTIME DESTINATION bin
  26. LIBRARY DESTINATION lib
  27. ARCHIVE DESTINATION lib
  28. )
  29.  
  30. INSTALL(FILES ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION bin COMPONENT Libraries)
  31.  
  32. IF(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS)
  33. INSTALL(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION bin COMPONENT System)
  34. ENDIF(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS)
  35.  
  36. INCLUDE(CPack)

我四处寻找一些帮助.我遇到的最好的事情是
this link

但它看起来并不那么惯用.如果我们仔细观察CMakeLists.txt文件,它将获得特定于机器的硬编码路径,这些路径将来肯定会发生变化:

  1. IF( WIN32 AND ${ARCH_32BIT})
  2.  
  3. SET(QT_INSTALLED_PATH "C:/QtMSVCX86/Qt5.5.0/5.5/msvc2013" )
  4.  
  5. ELSEIF(WIN32 AND ${ARCH_64BIT})
  6.  
  7. SET(QT_INSTALLED_PATH "C:/QtMSVCX64/Qt5.5.0/5.5/msvc2013_64" )
  8.  
  9. ELSEIF(UNIX AND NOT MINGW AND ${ARCH_32BIT})
  10.  
  11. SET(QT_INSTALLED_PATH "/opt/Qt5.5.0/5.5/gcc/" )
  12.  
  13. ELSEIF(UNIX AND NOT MINGW AND ${ARCH_64BIT})
  14.  
  15. SET(QT_INSTALLED_PATH "/opt/Qt5.5.0/5.5/gcc_64/" )
  16.  
  17. ENDIF()
  18.  
  19. SET(CMAKE_AUTOMOC ON)
  20. SET(CMAKE_AUTOUIC ON)
  21. SET(CMAKE_AUTORCC ON)
  22.  
  23. FIND_PACKAGE(Qt5Widgets PATHS ${QT_INSTALLED_PATH} NO_DEFAULT_PATH)
  24. FIND_PACKAGE(Qt5Qml PATHS ${QT_INSTALLED_PATH} NO_DEFAULT_PATH)
  25. FIND_PACKAGE(Qt5Quick PATHS ${QT_INSTALLED_PATH} NO_DEFAULT_PATH)

解决方法

看看CMake的 Bundle Utilities它包含一个FIXUP_BUNDLE宏,它收集可执行文件的所有必要依赖项,包括Qt.它在Windows,Linux和Mac上的工作方式基本相同.您可以首先将FIXUP_BUNDLE(myapp)添加到CMake文件中.在CPack运行期间发生了实际的依赖关系解析和复制.根据项目规模和复杂程度,需要进行一些调整,但总的来说,我已经看到它在基于CMake的构建系统的大型跨平台Qt项目中成功使用

猜你在找的Linux相关文章