qt 动态库项目指定dll生成路径

在项目中把各个功能分模块管理,方便后期扩展维护,但是主程序在调用模块的时候,必须在主程序exe所在目录放入模块dll动态库。

主要实现把模块编译目录下的dll动态库放到主程序编译目录下,和主程序exe文件放在一起.

例:

项目目录:

 Probe为项目主目录。

1. DESTDIR 指定编译文件路径

修改目标生成路径方式

模块xxx.pro中添加:

DESTDIR += $$OUT_PWD/../Probe/release
message($$OUT_PWD/../Probe/release)
$$OUT_PWD/../Probe/release: dll动态库最终生成路径
$$OUT_PWD: QMake内建变量,表示生成路径,第一次接触$$OUT_PWD可以通过message($$OUT_PWD)打印查看路径,更多qmake内建变量介绍
message($$OUT_PWD/../Probe/release): 表示打印dll动态库生成路径
优点: 操作简单
缺点:只能设置一个dll目标输出路径,不能把dll输出到多个路径下,不够灵活

2. QMAKE_POST_LINK 执行CMD命令实现

QMAKE_POST_LINK 在编译完成(编译完成,不是qmake完成)后执行自定义CMD(Windows)/Shell(Linux)命令。

注意:必须重新生成dll/exe文件(重新编译/修改cpp文件)才会触发QMAKE_POST_LINK 执行

QMAKE_POST_LINK 执行命令格式:

QMAKE_POST_LINK += CMD命令
QMAKE_POST_LINK += echo "hello, wordl!";

 

例如把release下的Logger.dll复制到上级目录:

方式1(推荐):

$$replace 路径分隔符/成\

#正则 s\'[/]\''\\'  字符串/转\
DYNAMIC_DLL_PATH = $$OUT_PWD/release/Logger.dll
DYNAMIC_DLL_PATH = $$replace(DYNAMIC_DLL_PATH, /, \\)
TARGET_DLL_PATH = $$OUT_PWD/Logger.dll
TARGET_DLL_PATH = $$replace(TARGET_DLL_PATH, /, \\)
QMAKE_POST_LINK += $$QMAKE_COPY_FILE \"$$DYNAMIC_DLL_PATH\" \"$$TARGET_DLL_PATH\";
message($$QMAKE_COPY_FILE \"$$DYNAMIC_DLL_PATH\" \"$$TARGET_DLL_PATH\")

方式2:

正则替换路径分隔符/成\

#正则 s\'[/]\''\\'  字符串/转\
DYNAMIC_DLL_PATH = $$OUT_PWD/release/Logger.dll
DYNAMIC_DLL_PATH ~= s\'[/]\''\\'
TARGET_DLL_PATH = $$OUT_PWD/Logger.dll
TARGET_DLL_PATH ~= s\'[/]\''\\'
QMAKE_POST_LINK += $$QMAKE_COPY_FILE \"$$DYNAMIC_DLL_PATH\" \"$$TARGET_DLL_PATH\";
message($$QMAKE_COPY_FILE \"$$DYNAMIC_DLL_PATH\" \"$$TARGET_DLL_PATH\")


DYNAMIC_DLL_PATH和TARGET_DLL_PATH 是定义的变量,分别是DLL生成路径$$OUT_PWD/release/Logger.dll)和DLL复制目标路径($$OUT_PWD)
$$QMAKE_COPY_FILE 是qmake内建字符串变量,根据系统不同生成不同复制文件命令,例如(Windows下是copy,linux下是cp)
message($$QMAKE_COPY_FILE \"$$DYNAMIC_DLL_PATH\" \"$$TARGET_DLL_PATH\"): 打印执行文件命令

qmake输出message(...)内容:
Project MESSAGE: copy /y "D:\work\svnwork\Probe\ProbeTableAP200\build-ProbeTableAP200-H-Desktop_Qt_5_14_2_MSVC2017_32bit-Release\Logger\release\Logger.dll" "D:\work\svnwork\Probe\ProbeTableAP200\build-ProbeTableAP200-H-Desktop_Qt_5_14_2_MSVC2017_32bit-Release\Logger\Logger.dll"

优点: 灵活,功能强大,因为通过执行cmd命令实现的,所以不仅仅是copy命令,其他命令也可以

缺点: 操作繁琐

3. INSTALLS方式(2023-04-17 推荐)

方式简单,操作灵活(可以同时dll输出到多个路径)

1. 在项目中添加一个自定义步骤,以支持INSTALLS方式.

添加Build步骤->Custom Process Step

 Command: nmake

Arguments: install

2. xxx.pro

target.files += $$OUT_PWD/release/Logger.dll
target.path = $$OUT_PWD/../Probe/release
INSTALLS += target

这样在编译Logger模块的时候,会把Logger.dll输出到Probe主程序的exe所在目录.

 

posted @ 2023-03-24 10:03  耿明岩  阅读(1482)  评论(0编辑  收藏  举报
希望能帮助到你,顺利解决问题! ...G(^_−)☆