定位软件包时未设置用于qt的CMake DragNDrop框架rpath

时间:2019-08-04 02:43:46

标签: c++ macos cmake qt5 rpath

在使用brew qt5.13.0提供的qt框架创建我的项目的DragNDrop捆绑软件时,尽管我将rpath设置为将框架复制到捆绑软件中的路径,但rpath似乎不被接受。

我尝试过set(MACOSX_RPATH ON)set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE),但是结果仍然使用静态路径而不是rpath,并且无法在其他机器上找到捆绑的Framework brew qt 5.13.0

在5.9.5中,使我的cmake正常工作所需的全部是 set (CMAKE_INSTALL_RPATH "@executable_path/../Frameworks") 然后进一步包装

        set (CPACK_GENERATOR "DragNDrop")
        install (DIRECTORY ${Qt5_DIR}/../../QtCore.framework DESTINATION *.app/Contents/Frameworks)
        install (DIRECTORY ${Qt5_DIR}/../../QtGui.framework DESTINATION *.app/Contents/Frameworks)
        install (DIRECTORY ${Qt5_DIR}/../../QtPrintSupport.framework DESTINATION *.app/Contents/Frameworks)
        install (DIRECTORY ${Qt5_DIR}/../../QtTest.framework DESTINATION *.app/Contents/Frameworks)
        install (DIRECTORY ${Qt5_DIR}/../../QtWidgets.framework DESTINATION *.app/Contents/Frameworks)
        install (FILES "${Qt5_DIR}/../../../plugins/platforms/libqcocoa.dylib" DESTINATION *.app/Contents/PlugIns/platforms)

在开源安装程序的qt 5.9.5上,我用otool -L看到以下结果

    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1570.15.0)
    /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL (compatibility version 1.0.0, current version 1.0.0)
    @rpath/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.9.0, current version 5.9.5)
    @rpath/QtGui.framework/Versions/5/QtGui (compatibility version 5.9.0, current version 5.9.5)
    @rpath/QtCore.framework/Versions/5/QtCore (compatibility version 5.9.0, current version 5.9.5)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

当从brew使用qt 5.13.0时,我得到以下信息

    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1575.17.0)
    /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL (compatibility version 1.0.0, current version 1.0.0)
    /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.13.0, current version 5.13.0)
    /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui (compatibility version 5.13.0, current version 5.13.0)
    /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore (compatibility version 5.13.0, current version 5.13.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

1 个答案:

答案 0 :(得分:0)

经过大量的挖掘,我终于弄明白了发生了什么。 如here所示,当brew生成qt时,它们使用-no-rpath选项。因此,我没有在我需要的框架上使用install_name_tool,而是发现了有关qt-online-installer的巧妙技巧。它是可脚本化的,我在其中找到了一个仓库,请参阅本劳的qtci

然后添加

        - git clone https://github.com/benlau/qtci.git; 
        - source qtci/path.env; 
        - install-qt-online qt.qt5.5130.clang_64 ~/

-travis.yml,我可以设置Qt_DIR="~/qt/5.13.0/clang_64/lib/cmake/Qt5"并链接到预期的rpaths

    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1575.17.0)
    /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL (compatibility version 1.0.0, current version 1.0.0)
    @rpath/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.13.0, current version 5.13.0)
    @rpath/QtGui.framework/Versions/5/QtGui (compatibility version 5.13.0, current version 5.13.0)
    @rpath/QtCore.framework/Versions/5/QtCore (compatibility version 5.13.0, current version 5.13.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)