赞
踩
目录
7.1.1 节数超过对象文件格式限制: 请使用 /bigobj 进行编译
7.1.5 无法打开文件“C:\OSGeo4W\lib\libprotobuf-lite.lib”
7.1.6 无法打开文件“SETUPAPI_LIBRARY-NOTFOUND.lib”
7.1.7 无法打开文件“VERSION_LIBRARY-NOTFOUND.lib”
QGIS作为一款开源的桌面GIS软件,其易用性、稳定性和可扩展性受到越来越多的技术人员和学者的好评与支持,并且基于社区的开发模式使QGIS的研发和迭代非常迅速。目前,QGIS已经具有完整且稳定的桌面GIS功能,并且逐渐地在移动GIS、web GIS等方向进行扩展,可以与众多开源GIS软件和模块相互支持,形成工具链,并构成功能全面的GIS软件体系,在开源GIS中具有独特且完整的应用前景。
本博文是通过源码来编译、安装QGIS,非源码方式参见:
VS2019+QT5.15.2+QGIS二次开发环境搭建(非源码方式)
说明:QGIS不同版本编译时,大体思路是相同的,但在细节上有些不同,故本篇博文编译的是针对本篇博文提到的编译环境(编译环境见后文描述),其它版本的编译,可能会遇到本篇博文没遇到过的问题,请根据实际情况排除。
打开QGIS官网Welcome to the QGIS project!,在官网的Search中输入osgeo4w,,如下:
图1
点击红色方框中的链接,如下:
图2
跳转到如下界面:
图3
单击红色链接,下载osgeo4w-setup.exe ,等待下载完成。
双击安装osgeo4w-setup.exe,选择:
图4
图5
图6
注意:请保证安装OSGeo4W的磁盘空间足够大,否则会影响后续编译。
图7
图8
输入官网的下载地址http://download.osgeo.org,单击下一步,如果报如下错:
图9
则退出安装向导,重新打开安装向导,再次进入图8界面,输入武汉大学镜像网址:http://gwmodel.whu.edu.cn/mirrors/osgeo4w ,如果没上述错误,则不管,继续下一步。
然后弹出下载选择库界面,如下:
图10
说明:
然后单击下一步,直到下载、安装完成,本步骤时间很长,请耐心等待,并保持网络畅通、电脑不休眠。本人从晚上20:11开始下载到凌晨5点才完成。如下为下载下来的库:
图11
如下为下载完所有的库之后安装这些库到OSGeo4W的安装目录下:
图12
2.1节是在线安装QGIS必要的库,但有时用于开发的机器(暂且称为A)由于某种原因不能上网,可以找一台能上网的机器(暂且称为B),按 2.1节步骤,在B中将下载下来的所有库即图11中的库和osgeo4w-setup.exe都拷贝到A上,在A中双击osgeo4w-setup.exe,弹出如下界面:
图13
选择 install from Local Directory, 一直单击“下一步”,直到出现如下界面时:
图14
单击“Browse...”按钮,找到拷贝过来的库目录(注意:库所在目录必须为最顶层目录,不能为其子目录,如上图中不能为release目录,且目录最好不能含中文),单击下一步,就开始安装所有库到osgeo4w-setup.exe的安装目录下。
Cygwin64:用于下载bison,flex软件。如果不装这两个软件,后面步骤的CMake会报错。
Cygwin64下载地址:Cygwin Installation
双击Cygwin ,分别只需下载bison、flex
图15
图16
图17
图18
图19
图20
Qt、VS下载不再详述,请自行到官网下载。注意:它们的版本不能太低,否则会出现很多诡异问题,本次本人Qt是5.14.1、VS是2019、CMake是3.23.0、QGIS为3.26.2。
各官网地址为:
https://download.qt.io/archive/qt/
https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/
源码下载链接为:
建议将源码文件QGIS移动到C:\OSGeo4W目录下。如若用其他路径,注意CMake默认路径是否出现错误。
图21
推荐使用x64 Native Tools Command Prompt for VS 2019,分别输入以下12条命令,建议命令一条一条执行输入,及时检查路径是否正确:
- set OSGEO4W_ROOT=C:\OSGeo4W
- call "%OSGEO4W_ROOT%\bin\o4w_env.bat“
- call "%OSGEO4W_ROOT%\etc\ini\python3.bat“
- call “%OSGEO4W_ROOT%\etc\ini\qt5.bat”
- path %path%;%QtDir%\bin;%OSGEO4W_ROOT%\bin;C:\cygwin64\bin
- set O4W_ROOT=%OSGEO4W_ROOT:\=/%
- set LIB_DIR=%O4W_ROOT%
- set GRASS_PREFIX=%OSGEO4W_ROOT%/apps/grass/grass80
- set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\include
- set LIB=%LIB%;%OSGEO4W_ROOT%\lib;%OSGEO4W_ROOT%\lib
- set LIB=%LIB%;%OSGEO4W_ROOT%\lib
- “C:\Program Files\CMake\bin\cmake-gui.exe“
说明:
注意:请不要找到cmake-gui.exe或其快捷方式直接双击启动,必须在命令行启动,因为这里设置了环境变量,一旦关闭命令行,则环境变量就无效,导致CMake找不到相关库的路径报错。
选择qgis源代码的根目录,编译后的代码建议选择与源代码同级目录下,目录不能包含中文,文件名为build。
图22
说明:
图23
入坑说明:CMake版本不能太低,否则会产生很多诡异问题。本人用CMake 3.23.0版本在本人笔记本能生成VS的解决方案,但在台式机始终报:Could not find Python (missing: PYTHON_LIBRARY)错误,导致死活生成不了VS的解决方案,卸载重装CMake 3.23.0版本问题解决。
在Visual Studio 2019中,将debug模式改为ReWithdebInfo或Debug,左侧代码中找到qgis.core,单击属性页,将平台工具集改成Visual Studio 2019 (v142)并应用。不需要每个工程都编译,只需编译qgis_core、qgis_app、qgis_gui、qgis_analysis、qgispython这几个核心库,外加provider_开头的插件即可,其它库工程等项目需要时再编译,亲测大概需要2个小时左右的时间,生成的所有文件在Build->output->bin->debug目录下,截图如下:
图24
图25
解决方法如下:
属性页
对话框C/C++
项。命令行
属性页。其他选项
框中键入编译器选项,添加 /bigobj
即可。这类错误是因为QGIS源码很新,但是zlib库很旧;QGIS源码用到最新版本zlib库中的函数,但下载下来的是旧的zlib库,旧zlib库中没有这些函数。解决方法如下:
从Release libzip 1.9.2 · nih-at/libzip · GitHub
中下载最新的libzip 1.9.2用CMake编译出zip.dll和zip.lib(CMake编译方法同上,下同),然后将编译出来的这两个文件和最新的zlib.h分别放到C:\OSGeo4W\bin、C:\OSGeo4W\lib、C:\OSGeo4W\include 目录下。注意:用CMake编译时,需要用到zip.dll、zip.lib库,否则CMake会失败,可以将C:\OSGeo4W\bin、C:\OSGeo4W\lib旧dll和lib放到C:\Windows\SysWOW64目录下,以便CMake不报错,能生成VS的解决方案。
找到qgsmapthemecollection.cpp,在文件顶部加入#include"qgssymbol.h"
图26
这是后缀名为proto的文件vector_tile.proto通过protoc.exe生成的vector_tile.pb.cc、vector_tile.pb.h文件和libprotobuf相关库不匹配,导致vector_tile.pb.cc的函数在libprotobuf相关库中不存在。本次编译用到的是protobuf 3.13.0,请从protobuf官网下载protobuf 3.13.0,然后用CMake编译出libprotobuf相关库和protoc.exe。protoc 生成C++代码语法如下:
protoc -I=Proto文件路径 –cpp_out=指定输出.h和.cc的目录 Proto文件,也可以使用protoc -h 查看更多帮助。
格式:protoc -I=proto文件存放目录 --cpp_out=生成的cpp文件存放目录 proto文件名
图27
注意:=号之间不能有空格。关于更多protoc生成C++代码的知识参见 《protoc 生成C++代码》。
这是debug版的链接release版的libprotobuf-lite.lib库了,改为libprotobuf-lited.lib即可或者让debug的libprotobuf-lite生成的库名也叫libprotobuf-lite.lib。
找到qgis_core工程,在其上单击鼠标右键,配置属性下拉框中选择相应的版本,如:Debug,然后选择“属性->配置属性->链接器->输入->附加依赖 删除该库即可。
找到qgis_core工程,在其上单击鼠标右键,配置属性下拉框中选择相应的版本,如:Debug,然后选择“属性->配置属性->链接器->输入->附加依赖 删除该库即可。
图28
解决方法: 找到qgis_core工程,在其上单击鼠标右键,配置属性下拉框中选择相应的版本,如:Debug,然后选择“属性->配置属性->链接器->输入->附加依赖 ,然后找到如下lib:
- C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64\SetupAPI.lib
- C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64\Version.lib
加入即可。注意:10.0.18362.0可能不同,根据自己所在机器更改。
: error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(qgispython.obj 中)
3>qgspythonutilsimpl.obj : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MDd_DynamicDebug”
这些错误产生的原因是:必要的依赖库不匹配造成的。解决方法如下:
在解决方案下,找到qgispython工程,在其上单击鼠标右键,配置属性下拉框中选择相应的版本,如:Debug,然后选择“属性->配置属性->C++->代码生成”属性页中的“运行库”下拉框中选择“多线程 (/MTd)” 。
建议将所有模块都设置为MTd再编译,否则会因为各种库不兼容(如:有的为Mdd或MT)导致错误。如:protobuf、libdxfrw、Qt5UiToolsd都设置为“多线程 (/MTd)” 。
(1): Qt5UiToolsd.lib(quiloader.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MTd_StaticDebug”(mocs_compilation_Debug.obj 中)
这个错误同7.2原理相同。如果你本机装了Qt,用VS2019打开Qt安装目录下的 Qt5.XX.Y\5.XX.Y\Src\qttools\src\src.pro
其中XX.Y为Qt版本号,如:5.14.1。然后选择Qt5UiTools工程,然后在该工程单击右键,选择“属性->配置属性->C++->代码生成”属性页中的“运行库”下拉框中选择“多线程 (/MTd)” 。将编译生成的Qt5UiToolsd.lib放到C:\OSGeo4W\apps\Qt5\lib\目录下,重新编译qgis_app工程即可。
(2):libdxfrw.lib : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值 “MDd_DynamicDebug”不匹配值“MTd_StaticDebug”(mocs_compilation_Debug.obj 中)
解决方法:选择libdxfrw工程,然后在该工程单击右键,选择“属性->配置属性->C++->代码生成”属性页中的“运行库”下拉框中选择“多线程 (/MTd)” 。
注意:qgis_core、qgis_app、qgis_gui、qgis_analysis、qgispython这几个核心库,外加provider_开头的插件、libdxfrw、libprotobuf-lite库,对于release版本,请保持属性->配置属性->C++->代码生成”属性页中的“运行库”下拉框中选择“多线程 (/MT)”,即这几个库必须一致,否则链接不过或即使编译链接能通过,主程序qgis.exe启动时,会各种崩溃。
这是因为后缀名为.ui的界面文件没有生成相应的头文件,将解决方案下的ui工程编译,该工程包含了qgis_gui工程中所有的界面文件,编译后就会生成ui_xxxxx.h文件。
注意:如果编译.ui报“CL.exe“已退出,代码为-1073741515”类似错误,是因为:编译ui文件时,找不到uic.exe,此时请“我的电脑->属性->高级系统设置->环境变量->Path”中加入前文安装的C:\QGIS\OSGeo4W\apps\Qt5\bin,如下:
然后重启Visual Studio后,再编译UI工程。
强烈吐槽一下:上面说明了debug版下编译QGIS 3.26.2的步骤,但现实中不建议用debug开发。因为QGIS官方对引用到的第三方库版本控制不好,如:
基于上面的原因,在实际开发时,建议用release版本的库开发,如果要设置断点,网上有很多release版本如何设置断点调试的文章,请自行百度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。