平台:Win10 22H2
环境:Qt-6.5.3,Qt Creator 11.0.3,MinGW 11.2.0 64-bit,CMake 3.24.2
问题01:编译出错,No rule to make target ...
项目类型:Qt Quick 2 Extension Plugin,MinGW 64-bit
编译系统:CMake
详细问题:
编译时出现以下两种错误之一(不定时出现两种之一·):
[CMakeFiles\XXX.dir\build.make:88: xxxqmltyperegistrations.cpp] Error 1
No rule to make target 'meta_types/qt6xxx_debug_metatypes.json', needed by 'xxx_qmltyperegistrations.cpp'. Stop.
原因:项目名称以Q或q开头,如QtPlugin, QPlugin等。
问题02:编译Android的插件出错,No rule to make target ...
项目类型:Qt Quick 2 Extension Plugin,Clang arm64-v8a.
编译系统:QMake
详细问题:
编译时出现以下错误:
:-1: error: No rule to make target '...\build-XXX-Qt_6_5_3_Clang_arm64_v8a-Debug\qmldir', needed by 'libXXX_arm64-v8a.so'. Stop.
原因:QMake生成的Makefile文件有问题,无法编译。
编译过程中有一步要复制qmldir文件到编译目录,在Makefile中生成一个以目标路径为内容的Target,路径分隔符是“/”:
.../build-XXX-Qt_6_5_3_Clang_arm64_v8a-Debug/qmldir: .../XXX/qmldir
$(COPY_FILE) ...\XXX\qmldir ...\build-XXX-Qt_6_5_3_Clang_arm64_v8a-Debug\qmldir
生成的库文件的有一个依赖项是上面这个Target,但是不知什么原因,路径分隔符却是“\”,
libXXX_arm64-v8a.so: ...\build-XXX-Qt_6_5_3_Clang_arm64_v8a-Debug\qmldir ...
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS) $(OBJCOMP)
导致找不到依赖项,无法复制文件,编译不成功。
QMake工程文件XXX.pro中有如下代码:
copy_qmldir.target = $$OUT_PWD/qmldir # 以qml目标路径为Target,路径分隔符是“/”
...
# 给生成的库文件增加依赖项,不知什么原因,路径分隔符转换成“\”,在MinGW编译没有此问题
PRE_TARGETDEPS += $$copy_qmldir.target
解决方法:
在上面第一句 后面加一句:
copy_qmldir.target = $$OUT_PWD/qmldir # 以qml目标路径为Target,路径分隔符是“/”
# 把copy_qmldir.target 的路径分隔符转换成“\”,这样在andriod编译中就能找到依赖项
copy_qmldir.target = $$replace(copy_qmldir.target, /, $$QMAKE_DIR_SEP)
...
# 给生成的库文件增加依赖项,不知什么原因,路径分隔符转换成“\”,在MinGW编译没有此问题
PRE_TARGETDEPS += $$copy_qmldir.target
# 把copy_qmldir.target 的路径分隔符转换成“\”,这样在android编译中就能找到依赖项
copy_qmldir.target = $$replace(copy_qmldir.target, /, $$QMAKE_DIR_SEP)
或者手动从工程目录中把qmldir复制到Andriod编译目录中,也能解决这个问题。