Qt多子目录项目中如何将编译好的lib1.dll复制到lib2目录?
Qt多项目构建中Lib1 DLL复制到Lib2目录的问题
项目结构
project.pro | |--app.pro | |--lib1.pro | |--lib2.pro
依赖关系
lib1是共享库lib2依赖lib1app依赖lib1和lib2
主项目配置(project.pro)
SUBDIRS = \ app \ lib1 \ lib2 \ # Introduce sub projects app.subdir = src/app lib1.subdir = src/core/lib1 lib2.subdir = src/core/lib2 # Make app dependent from lib1 and lib2 # This way lib1 and lib2 get build first lib2.depends = lib1 app.depends = lib1 lib2
问题描述
目前lib1编译正常,但无法通过lib1.pro将lib1.dll复制到lib2目录。已尝试的方法包括:
- 添加
CONFIG += file_copies配置 - 使用
INSTALLS +=...(已在Qt Creator中添加make install作为额外构建步骤) - 配置带复制命令的
QMAKE_POST_LINK - 用qmake的
exists()确认lib1.dll生成后再执行复制操作
所有尝试中lib1.dll都已正常生成,但复制到lib2目录的操作始终失败。
解决思路
1. 修正路径的相对/绝对指向
qmake中相对路径的基准是当前.pro文件所在目录,而非构建输出目录。在lib1.pro中引用lib2路径时,需确保路径层级正确,或用PWD/OUT_PWD等变量拼接绝对路径:
# 示例:根据实际目录层级拼接lib2的构建目录 LIB2_BUILD_DIR = $$OUT_PWD/../../lib2 # 用QMAKE_COPY自动适配Windows/Linux/macOS的复制命令 QMAKE_POST_LINK += $$QMAKE_COPY \"$$OUT_PWD/lib1.dll\" \"$$LIB2_BUILD_DIR/\" $$escape_expand(\\n\\t)
2. 确保目标目录存在
首次构建时lib2的构建目录可能未创建,导致复制失败,需先创建目录再复制:
LIB2_BUILD_DIR = $$OUT_PWD/../../lib2 # 先创建目标目录,再复制DLL QMAKE_POST_LINK += $$QMAKE_MKDIR \"$$LIB2_BUILD_DIR\" $$escape_expand(\\n\\t) QMAKE_POST_LINK += $$QMAKE_COPY \"$$OUT_PWD/lib1.dll\" \"$$LIB2_BUILD_DIR/\" $$escape_expand(\\n\\t)
3. 转移复制逻辑到lib2.pro
既然lib2依赖lib1,可以把复制操作放到lib2.pro中,在lib2构建前触发:
# 在lib2.pro中添加 LIB1_DLL = $$OUT_PWD/../../lib1/lib1.dll # 根据实际路径调整 # 构建lib2前复制lib1的DLL到自身目录 QMAKE_PRE_LINK += $$QMAKE_COPY \"$$LIB1_DLL\" \"$$OUT_PWD/\" $$escape_expand(\\n\\t)
4. 检查路径与权限
- 用调试输出确认路径是否正确:在
lib1.pro中添加message(Lib1 output dir: $$OUT_PWD)和message(Lib2 target dir: $$LIB2_BUILD_DIR),构建时查看Qt Creator输出窗口验证路径。 - 若构建目录在系统保护路径(如C:\Program Files),需将项目移到普通用户有权限的路径,或用管理员权限运行Qt Creator。
内容的提问来源于stack exchange,提问作者Redman
相关产品推荐
相关产品推荐

