【问题标题】:Deploy Custom Qt Widgets部署自定义 Qt 小部件
【发布时间】:2017-10-06 07:59:16
【问题描述】:

我尝试使用此 doc 部署我的自定义小部件,但是当我编译时只复制 .h 和 dll,.lib 和 .pdb 不是:

这是我配置复制指令时的 .pro

message(Building...)
QT          += widgets designer

PLUGIN_CLASS_NAME = QKWidgets

QTDIR_build {
    message(Qt Build)
    # This is only for the Qt build. Do not use externally. We mean it.
    PLUGIN_TYPE = designer
    load(qt_plugin)
    CONFIG += install_ok
} else {
    message(Public Build)
    # Public example:

    TARGET      = $$qtLibraryTarget($$TARGET)
    CONFIG     += plugin debug_and_release
    TEMPLATE    = lib

    target.path = $$[QT_INSTALL_PLUGINS]/designer
    #INSTALLS += target


    headersDataFiles.path = $$[QT_INSTALL_HEADERS]/$$PLUGIN_CLASS_NAME/
    headersDataFiles.files = $$PWD/*.h
    #INSTALLS += headersDataFiles

    libraryFiles.path = $$[QT_INSTALL_LIBS]
    CONFIG(debug, debug|release): libraryFiles.files = $$OUT_PWD/debug/*.lib $$OUT_PWD/release/*.pdb
    CONFIG(release, debug|release): libraryFiles.files = $$OUT_PWD/release/*.lib

    INSTALLS += target headersDataFiles libraryFiles

    message(Lib dest: $$[QT_INSTALL_LIBS])
    message(Lib src: $$libraryFiles.files)

}

message(General Build)

编辑: install_libraryFiles 没有出现在 Makefile 中

编辑2:

输出:

Project MESSAGE: Building...
Project MESSAGE: Public Build
Project MESSAGE: Lib dest: C:/Qt/Qt5.9.0/5.9.1/msvc2017_64/lib
Project MESSAGE: Lib src: C:/Users/SD/Documents/Studio/MyProject/Widgets/Build/Release/release/*.lib
Project MESSAGE: General Build
Project MESSAGE: Building...
Project MESSAGE: Public Build
Project MESSAGE: Lib dest: C:/Qt/Qt5.9.0/5.9.1/msvc2017_64/lib
Project MESSAGE: Lib src: C:/Users/SD/Documents/Studio/MyProject/Widgets/Build/Release/release/*.lib
Project MESSAGE: General Build
Project MESSAGE: Building...
Project MESSAGE: Public Build
Project MESSAGE: Lib dest: C:/Qt/Qt5.9.0/5.9.1/msvc2017_64/lib
Project MESSAGE: Lib src: C:/Users/SD/Documents/Studio/MyProject/Widgets/Build/Release/debug/*.lib C:/Users/SD/Documents/Studio/MyProject/Widgets/Build/Release/release/*.pdb
Project MESSAGE: General Build

【问题讨论】:

  • "message(Lib src: $$libraryFiles.files)" 打印什么?你能显示生成的 Makefile 吗?
  • 我编辑我的帖子。我明白为什么 .lib 没有被复制。这是因为 lib 不是在好时机创建的。当我第二次启动 qmake 时,libraryFiles 出现在我的 Makefile 中。一个解决方案是:QMAKE_POST_LINK 但我不喜欢这个。

标签: qt deployment makefile compilation


【解决方案1】:

使用QMAKE_POST_LINK 解决了我的问题:

message(Building...)

QT          += widgets designer

PLUGIN_CLASS_NAME = QKWidgets

QTDIR_build {
    message(Qt Build)
    # This is only for the Qt build. Do not use externally. We mean it.
    PLUGIN_TYPE = designer
    load(qt_plugin)
    CONFIG += install_ok
} else {
    message(Public Build)
    # Public example:

    TARGET      = $$qtLibraryTarget($$TARGET)
    CONFIG     += plugin debug_and_release
    TEMPLATE    = lib

    target.path = $$[QT_INSTALL_PLUGINS]/designer
    INSTALLS += target # headersDataFiles libraryFiles


    headersDataFiles.path = $$[QT_INSTALL_HEADERS]/$$PLUGIN_CLASS_NAME/
    headersDataFiles.files = $$PWD/*.h

    libraryFiles.path = $$[QT_INSTALL_LIBS]
    CONFIG(debug, debug|release): libraryFiles.files = $$OUT_PWD/debug/*.lib $$OUT_PWD/debug/*.pdb
    CONFIG(release, debug|release): libraryFiles.files = $$OUT_PWD/release/*.lib

    win32 {
        # Copy *.lib
        DESTDIR_WIN = $$libraryFiles.path
        DESTDIR_WIN ~= s,/,\\,g
        FILES = $$libraryFiles.files
        FILES ~= s,/,\\,g

        for(FILE, FILES){
            QMAKE_POST_LINK += $$quote(cmd /c copy /y $${FILE} $${DESTDIR_WIN}$$escape_expand(\\n\\t))
        }

        # Copy *.h
        DESTDIR_WIN = $$headersDataFiles.path
        DESTDIR_WIN ~= s,/,\\,g
        FILES = $$headersDataFiles.files
        FILES ~= s,/,\\,g

        for(FILE, FILES){
            QMAKE_POST_LINK += $$quote(cmd /c copy /y $${FILE} $${DESTDIR_WIN}$$escape_expand(\\n\\t))
        }
    }
}

【讨论】: