使用 qmake 将 dll 安装到 2 个目标(路径)中
Posted
技术标签:
【中文标题】使用 qmake 将 dll 安装到 2 个目标(路径)中【英文标题】:Install dll into 2 targets (paths) with qmake 【发布时间】:2016-04-11 14:39:59 【问题描述】:有以下 qt pro 文件:
CONFIG += plugin debug_and_release
TARGET = $$qtLibraryTarget(WidgetBoxPlugin)
TEMPLATE = lib
...
target.path = $$[QT_INSTALL_PLUGINS]/designer
creator_target.path = $$[QTCREATOR_BIN_PATH]/plugins/designer
INSTALLS += target creator_target
结果 dll 文件被复制到 2 个路径(目标)中。现在由于某种原因它不起作用:qmake 不会为第二个目标生成安装(复制)脚本(设置了 QTCREATOR_BIN_PATH)。如何正确编写第二次安装以便将 dll 安装到 2 个目的地?
完整项目:https://github.com/akontsevich/WidgetBox
【问题讨论】:
【参考方案1】:如何正确编写我的项目目标的副本以便安装 dll 到 2 个目的地?
你可以尝试用QMAKE_EXTRA_COMPILERS
创建一个新的目标路径:
http://blog.qt.io/blog/2008/04/16/the-power-of-qmake/
creator_target.name = Copying the target dll to Qt Creator plugins directory as well
creator_target.input = $$qtLibraryTarget(WidgetBoxPlugin)
creator_target.path = $$[QTCREATOR_BIN_PATH]/plugins/designer
creator_target.CONFIG += target_predeps no_link
creator_target.output = WidgetBoxPlugin.dll
QMAKE_EXTRA_COMPILERS += creator_target
INSTALLS += creator_target
另一种可能更简单的方法是始终尝试复制后期构建,但使用 xcopy /D/Y 命令语法,如果目标存在,我们可以避免复制:
QMAKE_POST_LINK += xcopy /d/y $$qtLibraryTarget(WidgetBoxPlugin) $QTCREATOR_BIN_PATH/plugins/designer
这个命令的问题是正确地转义输入,但它在 SO 上更广为人知:https://***.com/search?q=QMAKE_POST_LINK
【讨论】:
Я тоже пробую разные способы решения проблемы, но у меня нет вашего проекта。 Собоими способами довольно просто всё。 Это то, что я лично делаю для решения проблемы。 您可以在这里查看我的项目:github.com/akontsevich/WidgetBox 认为专业内容就足够了。 我看了一眼项目,认为 QMAKE_EXTRA_COMPILERS 应该像这样工作。 AlexanderVX,上面的也不能正常工作:warning: Compiler: creator_target: No output file specified
on qmake。
认为这是 qmake 中的一些错误:我的变体应该可以工作,你的也应该工作。但是由于某种原因,qmake 没有在 Makefile 中生成正确的安装。我第一次创建它时就为我工作。【参考方案2】:
这里有建议: https://forum.qt.io/topic/66090/qmake-does-not-generate-2nd-install-target-in-makefile/3#
根据文档 (https://wiki.qt.io/QMake-top-level-srcdir-and-builddir),正确的构建目录宏是 $$OUT_PWD,所以正确的安装代码是:
target.path = $$[QT_INSTALL_PLUGINS]/designer
creator_target.name = Copying the target dll to Qt Creator plugins directory as well
creator_target.input = $qtLbraryTarget(WidgetBoxPlugin)
creator_target.path = $$(QTCREATOR_BIN_PATH)/plugins/designer
creator_target.CONFIG += no_check_exist
creator_target.output = WidgetBoxPlugin.dll
creator_target.files = $$OUT_PWD/release/WidgetBoxPlugin.dll
QMAKE_EXTRA_COMPILERS += creator_target
INSTALLS += target creator_target
奇怪的是为什么 [] 括号只对目标有效,而 () 对于 creator_target 是必需的?
【讨论】:
以上是关于使用 qmake 将 dll 安装到 2 个目标(路径)中的主要内容,如果未能解决你的问题,请参考以下文章
Windows下使用命令行编译Qt项目(解决DLL丢失问题)
c#如何把一个main()和若干个dll打包生成单一的exe文件?