一、前置环境
0.Win10操作系统
1.VS2015已安装
2.qgis 3.16.3源代码版本已下载并解压
解压某个目录,列如我的目录为:H:\DevOps\QGIS3_16_3\QGIS-final-3_16_3
二、环境下载
1.安装Cygwin64下载Flex、Bison
[1].下载Cygwin64安装包,setup-x86_64.exe。
[2].安装Cygwin64
第一步: Choose A Download Source
选择:Install from Intenet
第四步: Select Your Intenet Connection
选择: Direct Connection
第五步: 添加国内Cygwin镜像源http://mirrors.163.com/cygwin/ ,添加后并选择这个源。
[3]安装Flex、Bison
Flex>=2.5.6
Bison>=2.4
cmake (可选 如果机器没有提前安装cmake软件,可以通过此处下载。后面配置需要注意一下)
操作说明:选择View: 为Catalog 后面选择 Keep, 依次 搜索Flex 在下面点击Skip后会出现一个版本。然后选择其他的(Bison等)
2.下载OSGeo4W安装包并安装QGIS依赖环境qgis-dev-deps或qgis-ltr-dev-deps
[1].下载OSGeo4W安装包,osgeo4w-setup.exe。
[2].安装OSGeo4W
第一步:选择 Advanced Install
说明:一定选择这个类型,可以进行版本的选择。
第二步: Choose A Download Source
选择:Install from Intenet
第四步: Select Your Intenet Connection
选择: Direct Connection
第五步: 添加国内OSGeo4W武大源镜源http://gwmodel.whu.edu.cn/mirrors/osgeo4w ,添加后并选择这个源。
说明:官方源现在只能下到3.22以上版本的依赖环境,环境的内容、版本、路径都发生了比较大的改变,与老版本的源码兼容性不好。而武大源可以安装3.13.0版本的依赖环境,适应于qgis3.16及以下版本
[3]安装qgis-dev-deps
本文只安装qgis-dev-deps
三、环境配置
1.新建目录dependences
目录路径为H:\DevOps\QGIS3_16_3\dependences
2.剪切已下载的cywin64和OSGeo4W
剪切到 H:\DevOps\QGIS3_16_3\dependences目录下)
3.修改源代码目录下的msvc-env.bat文件
用文本编辑器打开 H:\DevOps\QGIS3_16_3\QGIS-final-3_16_3\ms-windows\osgeo4w\msvc-env.bat文件
[1]修改VS2015配置
因为笔者VS2015安装路径是默认安装的,所有vs2015这一块不需要修改。
[2]修改OSGEO4W_ROOT路径
set OSGEO4W_ROOT=C:\OSGeo4W
修改为自己的OSGeo4W的路径
set OSGEO4W_ROOT=H:\DevOps\QGIS3_16_3\dependences\OSGeo4W
[3]修改OSGEO4W_ROOT路径
[4]修改PYTHONPATH
set PYTHONPATH=
if exist "%PROGRAMFILES%\CMake\bin" path %PATH%;%PROGRAMFILES%\CMake\bin
if exist "%PF86%\CMake\bin" path %PATH%;%PF86%\CMake\bin
if exist c:\cygwin64\bin path %PATH%;c:\cygwin64\bin
if exist c:\cygwin\bin path %PATH%;c:\cygwin\bin
这里要说明下:这里实际上将camek的bin及cygwin64中的bin添加到环境变量的path中,而cygwin64中有flex.exe bison.exe cmake.exe等内容,这就是前面讲到你可以不装Cmake,如果没有装会在cygwin64中找。
因为c:\cygwin64目录已被我们截切到了H:\DevOps\QGIS3_16_3\dependences目录下,所以为了找到cygwin64目录。在上面的代码后面添加如下代码
if exist H:\DevOps\QGIS3_16_3\dependences\cygwin64\bin path %PATH%;H:\DevOps\QGIS3_16_3\dependences\cygwin64\bin
[5]添加gdal304.dll和proj_8_2.dll依赖
在goto end之前添加如下代码。解决构建时可能会找不到gdal304.dll和proj_8_2.dll,而报error MSB6006: “cmd.exe”已退出,代码为 -1073741515,因此添加下述gdal和proj环境路径
path %path%;%OSGEO4W_ROOT%\apps\gdal-dev\bin
path %path%;%OSGEO4W_ROOT%\apps\proj-dev\bin
[6]设置SetupAPI.Lib
:x86_64
set VCARCH=amd64
....
set SETUPAPI_LIBRARY=%PF86%\Windows Kits\10\Lib\%VCSDK%\um\x64\SetupAPI.Lib
根据自己的情况设置SetupAPI.Lib.列如我的机器Windows Kits\10下面没有SetupAPI.Lib,只有Windows Kits\8.1下有。我的机器路径为:C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64\SetupAPI.Lib。为了方便在上面的最后一句话后边添加下面的话
if not exist "%SETUPAPI_LIBRARY%" set SETUPAPI_LIBRARY=%PF86%\Windows Kits\8.1\Lib\winv6.3\um\x64\SetupAPI.Lib
最后完整代码如下
@echo off
REM ***************************************************************************
REM msvc-env.cmd
REM ---------------------
REM begin : June 2018
REM copyright : (C) 2018 by Juergen E. Fischer
REM email : jef at norbit dot de
REM ***************************************************************************
REM * *
REM * This program is free software; you can redistribute it and/or modify *
REM * it under the terms of the GNU General Public License as published by *
REM * the Free Software Foundation; either version 2 of the License, or *
REM * (at your option) any later version. *
REM * *
REM ***************************************************************************
if not "%PROGRAMFILES(X86)%"=="" set PF86=%PROGRAMFILES(X86)%
if "%PF86%"=="" set PF86=%PROGRAMFILES%
if "%PF86%"=="" (echo PROGRAMFILES not set & goto error)
if "%VCSDK%"=="" set VCSDK=10.0.14393.0
set ARCH=%1
if "%ARCH%"=="x86" goto x86
if "%ARCH%"=="x86_64" goto x86_64
goto usage
:x86
set VCARCH=x86
set CMAKE_COMPILER_PATH=%PF86%\Microsoft Visual Studio 14.0\VC\bin
set DBGHLP_PATH=%PF86%\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\x86
set SETUPAPI_LIBRARY=%PF86%\Windows Kits\10\Lib\%VCSDK%\um\x86\SetupAPI.Lib
goto archset
:x86_64
set VCARCH=amd64
set CMAKE_COMPILER_PATH=%PF86%\Microsoft Visual Studio 14.0\VC\bin\amd64
set DBGHLP_PATH=%PF86%\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\x64
set SETUPAPI_LIBRARY=%PF86%\Windows Kits\10\Lib\%VCSDK%\um\x64\SetupAPI.Lib
if not exist "%SETUPAPI_LIBRARY%" set SETUPAPI_LIBRARY=%PF86%\Windows Kits\8.1\Lib\winv6.3\um\x64\SetupAPI.Lib
:archset
if not exist "%SETUPAPI_LIBRARY%" (echo SETUPAPI_LIBRARY not found & goto error)
if "%CC%"=="" set CC=%CMAKE_COMPILER_PATH:\=/%/cl.exe
if "%CXX%"=="" set CXX=%CMAKE_COMPILER_PATH:\=/%/cl.exe
set CLCACHE_CL=%CMAKE_COMPILER_PATH:\=/%/cl.exe
if "%OSGEO4W_ROOT%"=="" if "%ARCH%"=="x86" (
set OSGEO4W_ROOT=H:\DevOps\QGIS3_16_3\dependences\OSGeo4W
) else (
set OSGEO4W_ROOT=H:\DevOps\QGIS3_16_3\dependences\OSGeo4W
)
if not exist "%OSGEO4W_ROOT%\bin\o4w_env.bat" (echo o4w_env.bat not found & goto error)
call "%OSGEO4W_ROOT%\bin\o4w_env.bat"
call "%OSGEO4W_ROOT%\bin\py3_env.bat"
call "%OSGEO4W_ROOT%\bin\qt5_env.bat"
set VS140COMNTOOLS=%PF86%\Microsoft Visual Studio 14.0\Common7\Tools\
call "%PF86%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %VCARCH%
path %path%;%PF86%\Microsoft Visual Studio 14.0\VC\bin
set GRASS7=
if exist %OSGEO4W_ROOT%\bin\grass74.bat set GRASS7=%OSGEO4W_ROOT%\bin\grass74.bat
if exist %OSGEO4W_ROOT%\bin\grass76.bat set GRASS7=%OSGEO4W_ROOT%\bin\grass76.bat
if exist %OSGEO4W_ROOT%\bin\grass78.bat set GRASS7=%OSGEO4W_ROOT%\bin\grass78.bat
if "%GRASS7%"=="" (echo GRASS7 not found & goto error)
for /f "usebackq tokens=1" %%a in (`%GRASS7% --config path`) do set GRASS_PREFIX=%%a
set PYTHONPATH=
if exist "%PROGRAMFILES%\CMake\bin" path %PATH%;%PROGRAMFILES%\CMake\bin
if exist "%PF86%\CMake\bin" path %PATH%;%PF86%\CMake\bin
if exist c:\cygwin64\bin path %PATH%;c:\cygwin64\bin
if exist c:\cygwin\bin path %PATH%;c:\cygwin\bin
if exist H:\DevOps\QGIS3_16_3\dependences\cygwin64\bin path %PATH%;H:\DevOps\QGIS3_16_3\dependences\cygwin64\bin
set LIB=%LIB%;%OSGEO4W_ROOT%\apps\Qt5\lib;%OSGEO4W_ROOT%\lib
set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\apps\Qt5\include;%OSGEO4W_ROOT%\include
REM ############################################################
REM ##构建时可能会找不到gdal304.dll和proj_8_2.dll,而报error MSB6006: “cmd.exe”已退出,代码为 -1073741515,因此添加下述gdal和proj环境路径。
REM ############################################################
path %path%;%OSGEO4W_ROOT%\apps\gdal-dev\bin
path %path%;%OSGEO4W_ROOT%\apps\proj-dev\bin
goto end
:usage
echo usage: %0 [x86^|x86_64]
echo sample: %0 x86_64
exit /b 1
:error
echo ENV ERROR %ERRORLEVEL%: %DATE% %TIME%
exit /b 1
:end
3.打开源代码目录下package-nightly.cmd文件检查Qgis依赖路径是否正确
-D SETUPAPI_LIBRARY="%SETUPAPI_LIBRARY%" ^
-D PROJ_LIBRARY=%O4W_ROOT%/apps/proj-dev/lib/proj.lib ^
-D PROJ_INCLUDE_DIR=%O4W_ROOT%/apps/proj-dev/include ^
-D GDAL_LIBRARY=%O4W_ROOT%/apps/gdal-dev/lib/gdal_i.lib ^
-D GDAL_INCLUDE_DIR=%O4W_ROOT%/apps/gdal-dev/include ^
-D GEOS_LIBRARY=%O4W_ROOT%/lib/geos_c.lib ^
-D SQLITE3_LIBRARY=%O4W_ROOT%/lib/sqlite3_i.lib ^
-D SPATIALITE_LIBRARY=%O4W_ROOT%/lib/spatialite_i.lib ^
-D PYTHON_EXECUTABLE=%O4W_ROOT%/bin/python3.exe ^
-D SIP_BINARY_PATH=%PYTHONHOME:\=/%/sip.exe ^
-D PYTHON_INCLUDE_PATH=%PYTHONHOME:\=/%/include ^
-D PYTHON_LIBRARY=%PYTHONHOME:\=/%/libs/%PYVER%.lib ^
-D QT_LIBRARY_DIR=%O4W_ROOT%/lib ^
-D QT_HEADERS_DIR=%O4W_ROOT%/apps/qt5/include ^
-D CMAKE_INSTALL_PREFIX=%O4W_ROOT%/apps/%PACKAGENAME% ^
-D FCGI_INCLUDE_DIR=%O4W_ROOT%/include ^
-D FCGI_LIBRARY=%O4W_ROOT%/lib/libfcgi.lib ^
-D QCA_INCLUDE_DIR=%OSGEO4W_ROOT%\apps\Qt5\include\QtCrypto ^
-D QCA_LIBRARY=%OSGEO4W_ROOT%\apps\Qt5\lib\qca-qt5.lib ^
-D QSCINTILLA_LIBRARY=%OSGEO4W_ROOT%\apps\Qt5\lib\qscintilla2.lib ^
说明:这个文件基本上不需要做任何改动
4.在OSGeo4W路径下创建批处理文件OSGeo4W-dev.bat和OSGeo4W-vs.bat
[1]创建OSGeo4W-dev.bat(初始化环境),添加内容如下:
@echo off
call H:\DevOps\QGIS3_16_3\QGIS-final-3_16_3\ms-windows\osgeo4w\msvc-env.bat x86_64
cd /d H:\DevOps\QGIS3_16_3\QGIS-final-3_16_3\ms-windows\osgeo4w
@cmd
[2]创建OSGeo4W-vs.bat (初始化环境,并在环境下运行vs2015),添加内容如下:
@echo off
call H:\DevOps\QGIS3_16_3\QGIS-final-3_16_3\ms-windows\osgeo4w\msvc-env.bat x86_64
cd /d H:\DevOps\QGIS3_16_3\QGIS-final-3_16_3\ms-windows\osgeo4w\build-qgis-test-x86_64
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe" qgis.sln
@cmd
四、构建
-
运行OSGeo4W-dev.bat初始化环境。
-
在命令行中运行configonly.bat。(构建如有报错请看 六)
等待构建,若结果为completely,且在源码目录 H:\DevOps\QGIS3_16_3\QGIS-final-3_16_3\ms-windows\osgeo4w下生成了build-qgis-test-x86_64文件夹,则说明配置成功。构建输出信息如下:
BEGIN: 2022/04/23 周六 16:30:57.11 CMAKE: 2022/04/23 周六 16:30:57.48 -- Selecting Windows SDK version to target Windows 10.0.19044. -- QGIS version: 3.16.3 Hannover (31603) -- Found OpenCL C++ headers: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/include -- Found GRASS 7: H:/DevOps/QGIS3_~2/DEPEND~1/OSGeo4W/apps/grass/grass78 (7.8.5, off_t size = 8) -- Found Proj: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/apps/proj-dev/lib/proj.lib version 8 (8.2.0) -- Found GEOS: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/geos_c.lib (3.8.1) -- Found GDAL: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/apps/gdal-dev/lib/gdal_i.lib (3.4.0dev) -- Found Expat: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/expat.lib -- Found Spatialindex: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/spatialindex-64.lib -- Found Qwt: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/apps/Qt5/lib/qwt.lib (6.1.3) -- Found libzip: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/zip.lib -- Found Sqlite3: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/sqlite3_i.lib -- Found Protobuf: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/libprotobuf.lib -- Found zlib: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/zlib.lib -- Found PostgreSQL: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/libpq.lib -- Found SpatiaLite: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/spatialite_i.lib -- Qt WebKit support enabled -- Found Qt version: 5.11.2 -- Found QScintilla2: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/apps/Qt5/lib/qscintilla2.lib (2.10.8) -- Found QtKeychain: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/apps/Qt5/lib/qt5keychain.lib -- Found QCA: H:\DevOps\QGIS3_~2\DEPEND~1\OSGeo4W\apps\Qt5\lib\qca-qt5.lib (2.1.3) -- Pedantic compiler settings enabled -- Debug output enabled -- Found GSL: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/gsl.lib;H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/cblas.lib -- Found Python executable: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/bin/python3.exe -- Found Python version: 3.7.0 -- Found Python library: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/apps/Python37/libs/python37.lib -- Found Python site-packages: H:/DevOps/QGIS3_~2/DEPEND~1/OSGeo4W/apps/Python37/Lib/site-packages -- Found PyQt5 version: 5.11.3 -- Found SIP version: 4.19.14 -- Found QScintilla2 PyQt module: 2.10.8 -- Performing Test COMPILER_HAS_DEPRECATED_ATTR -- Performing Test COMPILER_HAS_DEPRECATED_ATTR - Failed -- Performing Test COMPILER_HAS_DEPRECATED -- Performing Test COMPILER_HAS_DEPRECATED - Success -- Found exiv2: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/exiv2.lib -- Looking for pthread.h -- Looking for pthread.h - not found -- Found Threads: TRUE -- Found HDF5: hdf5::hdf5-shared (found version "1.10.5") -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Found NetCDF: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/netcdf.lib -- Found LibXml2: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/libxml2.lib (found version "2.9.1") -- Found OCI: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/oci.lib -- Found FCGI: H:/DevOps/QGIS3_16_3/dependences/OSGeo4W/lib/libfcgi.lib -- Using PROJ >= 6 srs database. -- Ctest Binary Directory set to: H:/DevOps/QGIS3_16_3/QGIS-final-3_16_3/ms-windows/osgeo4w/build-qgis-test-x86_64/output/bin -- Configuring done -- Generating done -- Build files have been written to: H:/DevOps/QGIS3_16_3/QGIS-final-3_16_3/ms-windows/osgeo4w/build-qgis-test-x86_64 Exiting after configuring build directory: H:\DevOps\QGIS3_16_3\QGIS-final-3_16_3\ms-windows\osgeo4w\build-qgis-test-x86_64 FINISHED: 2022/04/23 周六 16:32:22.98
五、编译
- 运行OSGeo4W-vs.bat,初始化环境并在环境下运行vs2015并打开qgs.sln工程。
- 在RelWithDebInfo模式下进行编译ALL_BUILD。
- 编译完成后调试qgis项目,运行成功,则编译完成。(编译报错请看 七)
六、构建报错的问题汇总
1.Could not find PyQt5
[1]报错信息
CMake Error at cmake/FindPyQt5.cmake:55 (MESSAGE):
Could not find PyQt5
Call Stack (most recent call first):
CMakeLists.txt:872 (find_package)
[2]分析报错问题
根据报错信息查看FindPyQt5.cmake,并添加一些 打印信息
FIND_FILE(_find_pyqt5_py FindPyQt5.py PATHS ${CMAKE_MODULE_PATH} NO_CMAKE_FIND_ROOT_PATH)
MESSAGE(STATUS ${_find_pyqt5_py}) //添加输出打印
MESSAGE(STATUS ${PYTHON_EXECUTABLE})//添加输出打印
EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} ${_find_pyqt5_py} OUTPUT_VARIABLE pyqt_config)
MESSAGE(STATUS ${pyqt_config})//添加输出打印
发现_find_pyqt5_py 打印的FindPyQt5.py路径 PYTHON_EXECUTABLE 打语python3.exe路径,这两个路径都没问题.但pyqt_config数据为空。猜猜 EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} ${_find_pyqt5_py} OUTPUT_VARIABLE pyqt_config) 执行python脚本有问题.
下面看下FindPyQt5.py文件中的代码
import os.path
import PyQt5.QtCore
try:
__import__('sipbuild')
except ImportError:
import sipconfig # won't work for SIP v5
import sys
cfg = sipconfig.Configuration()
sip_dir = cfg.default_sip_dir
print(sip_dir)#添加的打印消息
.......
发现 sip_dir路径不正确,是我在外网下载OSGeo4W时的路径,如果修改呢?
看了H:\DevOps\QGIS3_16_3\dependences\OSGeo4W\apps\Python37\lib\site-packages\sipconfig.py文件 。把下面的路径修改你的OSGeo4W路径相关路径即可。
# These are installation specific values created when SIP was configured.
_pkg_config = {
'arch': '',
'default_bin_dir': 'E:\\OSGeo4W_Download\\apps\\Python37',
'default_mod_dir': 'E:\\OSGeo4W_Download\\apps\\Python37\\Lib\\site-packages',
'default_sip_dir': 'E:\\OSGeo4W_Download\\apps\\Python37\\sip',
'deployment_target': '',
'platform': 'win32-msvc2015',
'py_conf_inc_dir': 'E:\\OSGeo4W_Download\\apps\\Python37\\include',
'py_inc_dir': 'E:\\OSGeo4W_Download\\apps\\Python37\\include',
'py_lib_dir': 'E:\\OSGeo4W_Download\\apps\\Python37\\libs',
'py_version': 0x030700,
'qt_framework': 0,
'sip_bin': 'E:\\OSGeo4W_Download\\apps\\Python37\\Scripts\\sip',
'sip_config_args': '--destdir E:\\OSGeo4W_Download\\apps\\Python37\\lib\\site-packages --bindir E:\\OSGeo4W_Download\\apps\\Python37\\Scripts --incdir E:\\OSGeo4W_Download\\apps\\Python37\\include',
'sip_inc_dir': 'E:\\OSGeo4W_Download\\apps\\Python37\\include',
'sip_module_dir': 'E:\\OSGeo4W_Download\\apps\\Python37\\lib\\site-packages',
'sip_root_dir': 'E:\\OSGeo4W_Download\\apps\\Python37\\lib\\site-packages',
'sip_version': 0x04130e,
'sip_version_str': '4.19.14',
'universal': ''
}
其实我觉得因为真正的原因是因为 import('sipbuild')异常才会有走这个逻辑,为什么异常呢?可能是没有sipbuild模块,那为什么没有,这个不太清楚,需要后续深入研究下。
七、编译报错问题汇总
1.完全限定文件名必须少于 260 个字符,并且目录名必须少于 248 个字符
错误 MSB3491 未能向文件“x64\RelWithDebInfo\zzz-db_manager-3-depend\zzz-db_m.539F09ED.tlog\zzz-db_manager-3-depend.lastbuildstate”写入命令行。指定的路径或文件名太长,或者两者都太长。完全限定文件名必须少于 260 个字符,并且目录名必须少于 248 个字符。 zzz-db_manager-3-depend C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppBuild.targets 312
很明显路径过长,在构建时修改构建目录,修改构建目录的文件为package-nightly.cmd
if "%BUILDNAME%"=="" set BUILDNAME=%PACKAGENAME%-%VERSION%%SHA%-%TARGET%-VC14-%ARCH%
if "%BUILDDIR%"=="" set BUILDDIR=%CD%\build-%PACKAGENAME%-%ARCH%
if not exist "%BUILDDIR%" mkdir %BUILDDIR%
if not exist "%BUILDDIR%" (echo could not create build directory %BUILDDIR% & goto error)
2.Generating resources_rc.py 系统找不到指定的路径。
在 zzz-db_manager-16-depend项目,也就是源代码目录\python\plugins\db_manage中CMakeLists.txt文件如下
ADD_SUBDIRECTORY(db_plugins)
ADD_SUBDIRECTORY(icons)
FILE(GLOB OTHER_FILES LICENSE README TODO)
FILE(GLOB PY_FILES *.py)
FILE(GLOB UI_FILES ui/*.ui)
PYQT_WRAP_UI(PYUI_FILES ${UI_FILES})
PYQT_ADD_RESOURCES(PYRC_FILES resources.qrc)
PLUGIN_INSTALL(db_manager . ${OTHER_FILES} ${PY_FILES} ${PYRC_FILES} metadata.txt)
PLUGIN_INSTALL(db_manager ui ${PYUI_FILES} ui/__init__.py)
猜测是因为resources.qrc文件没有生成resources_rc.py文件。需要弄明白为什么没有生成的原因?暂时这个问题没有解决.那就是OSgeo4w\apps\Pthon37\Scripts目录下pyrcc5库没起到作用。那是为什么?
开始以为是缺少pyrcc5.exe。通过安装版本QGIS版本的Python37下也没有pyrcc5.exe文件,但安装高点版本QGIS使用的Python39目录中含有pyrcc5.exe。而在Python37中只有只看到了pyrcc5.bat. 在文章Building a Python Plugin (QGIS3)中编写插件需要编写如下批处理文件。
@echo off
call "C:\Program Files\QGIS 3.0\bin\o4w_env.bat"
call "C:\Program Files\QGIS 3.0\bin\qt5_env.bat"
call "C:\Program Files\QGIS 3.0\bin\py3_env.bat"
@echo on
pyrcc5 -o resources.py resources.qrc
.可见pyrcct.bat可以实现这个目的。那我的没生效呢。我就运行了pyrcc5.bat,系统没有找文件。打开看了下@E:\OSGeo4W_Download\apps\Python37\python.exe -m PyQt5.pyrcc_main %*突然发现这个python.exe路径是我在外网下载时的路径。下载的路径已经变化了。把这个python.exe路径改成正确的路径。用这个批处理文件执行下.pyrcct.bat可以正常运行了。这是编译zzz-db_manager-16-depend项目,编译不会报错了。到此解决上面的问题,所有的编译报错问题都解决了。Python Console和 db_manager插件都可以正常运行了。
参考
2.QGIS plugin: Problems importing resources (resources_rc) file - plugin doesn't load - PATH problems?3.The QResource System
4.'pyrcc5' is not recognized as an internal or external command
6.QGIS3.6配置python插件开发环境及调试环境7.Building a Python Plugin (QGIS3)
stageinstall.cmake报错,因为resources_rc.py文件没找到到
CMake Error at /python/plugins/db_manager/stageinstall.cmake:110 (file):
file COPY cannot find
"H:/DevOps/QGIS3_16_3/QGIS-final-3_16_3/ms-windows/osgeo4w/build-qgis-test-x86_64/python/plugins/db_manager/resources_rc.py":
No error.
这个问题我觉得是前面问题2引起的
3.插件MetaSearch加载后报错
插件MetaSearch路径为:源代码目录\python\plugins\MetaSearchQgis加载完成后,界面顶部以感叹号形式报错信息如下:Python error:Couldn't load plugin 'MetaSearch' due to an error whe calling its classFactory() method SeeMessage log(Python Error) for more details
ModuleNot FoundError:No module named 'owslib下载离线文件解决,后续依次会出现如下问题
ModuleNot FoundError:No module named 'pytz'
ModuleNot FoundError:No module named 'requests'
ModuleNot FoundError:No module named 'jinja2'
ModuleNot FoundError:No module named 'pygments'
安装这些库(可以在线也可以下载后安装,注意离线安装这些库可能下载安装好多其他的依赖库,过程比较繁琐)有个想法就是下载安装版本的qgis找到安装版本的python37。把这个安装版本的python37拷贝到OSGeo4W/apps 目录下替换这目录下Python37(可以先将这个目录删除)。因为安装版本的Qgis下的python37已经安装好了这些库。