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
相关产品推荐
相关产品推荐

