QGIS3.16.3+VS2015+Win10环境编译


一、前置环境

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

四、构建

  1. 运行OSGeo4W-dev.bat初始化环境。

  2. 在命令行中运行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
    

五、编译

  1. 运行OSGeo4W-vs.bat,初始化环境并在环境下运行vs2015并打开qgs.sln工程。
  2. 在RelWithDebInfo模式下进行编译ALL_BUILD。
  3. 编译完成后调试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插件都可以正常运行了。

参考

1.pyqt:使用qrc文件配置图片资源,生成py文件

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

5.QGIS插件开发环境配置(小白版详细)

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已经安装好了这些库。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM