You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

qmake编译Test报错“No rule to make target”,子目录是否必须为当前应用子目录?

解决Qt子项目依赖编译错误:No rule to make target

首先明确说:子目录完全不需要是当前应用的子目录,你碰到的问题完全是Test.pro的配置错误导致的,和公共lib的位置无关。

先看你当前Test.pro里的核心问题:

  • 你用了TEMPLATE = subdirs(子项目管理模板),但在SUBDIRS里加了Test,却没指定这个Test对应的pro文件路径——而你的TestSuite目录下根本没有Test子目录,只有Test.pro本身,qmake找不到这个目标的构建规则,自然会报错。
  • 里面还错误写了app.file = $${PWD}/TestSuite/Test.pro,这完全是无效配置,你的Test项目里根本不需要关联App的pro文件。

给你三个可行的解决方案,选一个适合你的场景:

方案1:修正Test.pro的子项目管理配置

如果你的TestSuite目录下其实有个Test子目录(里面放测试程序的pro文件),那把Test.pro改成这样:

TEMPLATE = subdirs
# 声明要管理的子项目
SUBDIRS += Test \
           lib

# 指定每个子项目的pro文件路径
Test.file = $${PWD}/Test/Test.pro  # 指向Test子目录里的测试程序pro
lib.file = $${PWD}/../lib/lib.pro  # 指向根目录下的公共lib

# 设置依赖,确保先编译lib再编译测试程序
Test.depends = lib

QMAKE_CLEAN += $${OUT_PWD}/Makefile*

方案2:把Test.pro作为测试程序的主配置文件

如果Test.pro本身就是测试程序的主pro(不是用来管理子项目的),那直接换掉TEMPLATE = subdirs,改成测试程序的配置:

TEMPLATE = app  # 测试程序是应用程序类型
SOURCES += test_main.cpp \
           # 其他测试源文件...

# 链接公共lib
LIBS += -L$$OUT_PWD/../lib -lYourLibName  # YourLibName是lib项目里TARGET的名字
INCLUDEPATH += $$PWD/../lib  # 包含lib的头文件路径
DEPENDPATH += $$PWD/../lib

# 确保编译测试程序前先编译完lib
PRE_TARGETDEPS += $$OUT_PWD/../lib/libYourLibName.a  # Windows下换成.lib或.dll,Linux下是.so

方案3:统一在根目录管理所有子项目(推荐)

更省心的方式是把Test也加到根目录的Application.pro里,这样只需要在根目录执行一次qmake和make,就能编译所有项目:

TEMPLATE = subdirs
SUBDIRS += app \
           lib \
           TestSuite/Test

# 指定各子项目的路径
lib.file = $${PWD}/lib/lib.pro
app.file = $${PWD}/App/app.pro
Test.file = $${PWD}/TestSuite/Test.pro

# 设置依赖关系
app.depends = lib
Test.depends = lib

QMAKE_CLEAN += $${OUT_PWD}/Makefile*

你之前复制lib到TestSuite目录能编译,只是因为qmake刚好在当前目录找到了lib的pro文件,掩盖了配置错误,但这绝对不是正确的做法——公共lib就该放在共享位置,通过配置路径来引用,而不是复制多份。

内容的提问来源于stack exchange,提问作者Vencat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:28:03