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