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所在目录.