簡體   English   中英

將復制依賴關系復制到可執行輸出路徑

[英]CMake copy dependencies to executable output path

我有以下簡單的CMake項目。 它基本上是一個動態鏈接到Qt Widgets的可執行文件(我以Qt為例)。 我想弄清楚的是,是否可以使用CMake將所有鏈接庫(不僅是當前項目構建的庫)復制到可執行輸出目錄。

cmake_minimum_required(VERSION 3.12)
project(MyProject)

set(CMAKE_CXX_STANDARD 14)

set(QT_CMAKE_DIR "/Users/huser/Qt/5.11.1/clang_64/lib/cmake")
set(CMAKE_PREFIX_PATH ${CMAKE_MODULE_PATH} ${QT_CMAKE_DIR})
find_package(Qt5 REQUIRED COMPONENTS Widgets)

add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PUBLIC Qt5::Widgets)

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_LIST_DIR}/build)

問題是輸出目錄只包含MyProject可執行文件(這是預期的行為)。 但是,如果我將該可執行文件分發給沒有安裝Qt的人,他們將無法打開它。 因此,我想只將必要的庫/框架與可執行文件捆綁在一起。

運行otool -L MyProject列出了依賴項:

MyProject:
    @rpath/QtWidgets.framework/Versions/5/QtWidgets
    @rpath/QtGui.framework/Versions/5/QtGui
    @rpath/QtCore.framework/Versions/5/QtCore
    /usr/lib/libc++.1.dylib
    /usr/lib/libSystem.B.dylib

我正在尋找的是通過CMake在構建步驟之后立即將這3個框架復制到輸出目錄中的常用方法。 這將導致以下目錄結構:

build/
    MyProject
    QtWidgets.framework
    QtGui.framework
    QtCore.framework

任何幫助將不勝感激!

有兩個方面需要考慮:

  • 構建樹
  • 安裝樹

構建樹是您作為開發人員使用的工具,安裝樹是在執行install目標之后或在提取包的內容之后“創建”的。

要重新分發基於Qt5的項目,我建議您使用兩個工具:

  • CPack:這允許創建可以分發給用戶的生成包或存檔。 這些包括Windows安裝程序, .tar,gz.dmg ,...
  • macdeployqt:Qt提供的工具,允許復制應用程序所需的所有庫,插件......

使用BundleUtilities仍然需要您明確識別和安裝所有Qt插件。 對於更復雜的應用程序,使用Qt以外的依賴項確實很有幫助,但對於簡單的應用程序,我建議使用下面描述的方法。

您將在下面找到示例的修改版本,包括有關最佳實踐以及CPack和macdeployqt集成的一些建議。

配置和構建項目后,構建Package目標將創建一個MyProject-0.1.1-Darwin.dmg包。

請注意,還需要做更多工作,但這應該是一個很好的起點。

閱讀以下內容也可能有所幫助: https//gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling

要配置項目,請考慮將變量-DQt5_DIR:PATH=/path/to/lib/cmake/Qt5而不是硬編碼路徑。

假設源或項目位於名為src的目錄中,您可以使用以下命令配置項目:

mkdir build
cd build
cmake -DQt5_DIR:PATH=/Volumes/Dashboards/Support/Qt5.9.1/5.9.1/clang_64/lib/cmake/Qt5 ../src/

src/CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project(MyProject)

set(CMAKE_CXX_STANDARD 14)

# Suggestions:
# (1) EXECUTABLE_OUTPUT_PATH is deprecated, consider
#     setting the CMAKE_*_OUTPUT_DIRECTORY variables
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build)

set(CMAKE_MACOSX_BUNDLE 1)
set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks")

# Suggestions:
# (1) Do not hardcode path to Qt installation
# (2) Configure the project specifying -DQt5_DIR
#     See https://blog.kitware.com/cmake-finding-qt5-the-right-way/
# (3) By convention, "REQUIRED" is added at the end
find_package(Qt5 COMPONENTS Widgets REQUIRED)

add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PUBLIC Qt5::Widgets)
install(TARGETS ${PROJECT_NAME} DESTINATION . COMPONENT Runtime)

# Get reference to deployqt
get_target_property(uic_location Qt5::uic IMPORTED_LOCATION)
get_filename_component( _dir ${uic_location} DIRECTORY)
set(deployqt "${_dir}/macdeployqt")
if(NOT EXISTS ${deployqt})
  message(FATAL_ERROR "Failed to locate deployqt executable: [${deployqt}]")
endif()

# Execute deployqt during package creation
# See https://doc.qt.io/qt-5/osx-deployment.html#macdeploy
install(CODE "set(deployqt \"${deployqt}\")" COMPONENT Runtime)
install(CODE [===[
execute_process(COMMAND "${deployqt}" "${CMAKE_INSTALL_PREFIX}/MyProject.app")
]===] COMPONENT Runtime)

set(CPACK_GENERATOR "DragNDrop")
include(CPack)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM