wulu90.github.io
QGIS在Linux和Windows上的编译
2023年11月更新
在 Arch Linux 及 Windows 11 上都编译了 QGIS ,一些总结:都使用的 CMakePresets.json 文件来控制编译选项,包括 CMake 查找路径,可执行程序环境变量,编译开关,编辑工具平台,目标程序架构,Release/Debug 类型等等。避免了像以前一样需要调整 configonly.bat,msvc-env.bat package-nightly.bat 等文件,CMakePresets.json 文件直接作用于 CMakeLists.txt 文件。
安装 Visual Studio 2022 时勾选 C++ CMake tools for Windows,就不用额外安装 CMake 及 Ninja。
Linux上的编译调试
编译及调试
OS: Debian 11 On VMware Host by Windows 11
参照INSTALL.md文档中“3. Building on GNU/Linux”章节的说明,即可编译成功。
为方便在Visual Studio Code中调试,可在VS Code中安装 C/C++、CMake Tools等扩展,然后打开源代码所在文件夹,VS Code便会自动进行配置,底部状态栏中有编译调试相关选项。
远程调试
由于调试时单步执行太慢,可能是受限于虚拟机性能影响,便想采用VS Code Remote模式调试,需要解决以下几个问题:
在windows上ssh到虚拟机中的Linux
VS Code上连接到Linux,并启动Linux中编译好的QGIS
Windows 11/10 中自带ssh程序,如何连上VMware中的Linux呢?需将虚拟机的网络类型由NAT改为Bridge,然后在Linux中通过ip addr命令显示IP地址,ssh username@ipaddr即可连接。
Windows中的VS Code安装Remote-SSH扩展,根据提示操作即可。启动调试QGIS后,图形界面并没有显示,提示无法在非gui中运行,此时是我太naive。需要X Server。
安装VcXsrv,启动XLaunch,在Extra seetings界面中,选中Disable access control,否则会提示没有权限。
此时在VS Code Remote模式下启动调试QGIS,会有多个Terminal窗口,在输出无法运行的那个窗口中输入如下命令:
export DISPLAY="192.168.0.101:0.0"
其中“192.168.0.101”是X Server所在的ip地址,即windows的ip地址,测试一下xclock,时钟显示即成功。
然而,单步调试依然很慢。
Windows上编译调试
此前按照INSTALL.md上“4. Building on Windows”上是无法编译成功的,毕竟该文档也已经写明了,它是一份过期的文档。
Consider this section as example. It tends to outdate,
多次Google,加上多次实验,虽然最后略有瑕疵,依然有几个VS工程没有成功编译,但不影响主程序的运行,调试速度也正常,可称得上成功了。
环境
OS:windows 11 21H2 build 22000.537
SDK: 10.22000.0
VS: 2022 Community
Steps
安装Cygwin,并在其中安装flex,bison。
安装OSGeo4W,使用测试版本,地址http://download.osgeo.org/osgeo4w/testing/osgeo4w-setup.exe,安装qgis-dev-deps。
安装CMake。
下载pkg-config,地址https://sourceforge.net/projects/pkgconfiglite/files/,解压exe,后面在CMakeLists.txt中设置路径。
克隆代码。
下载msvc-dev.bat,地址https://github.com/jef-n/OSGeo4W/tree/workflows/src/qgis-dev/osgeo4w,替换代码中ms-windows/osgeo文件夹下同名文件,修改如下:
添加 set PF64=%PROGRAMFILE%
修改 VCSDK=10.0.22000.0
修改 OSGEO4W_ROOT=C:\OSGeo4W
修改 %PF86%\Microsoft Visual Studio\2019\%%e 为 %PF64%\Microsoft Visual Studio\2022\%%e
由于qgis-dev-deps默认安装的是grass8,修改grass7位grass8,即
if exist %OSGEO4W_ROOT%\bin\grass78.bat set GRASS7=%OSGEO4W_ROOT%\bin\grass78.bat
改为
if exist %OSGEO4W_ROOT%\bin\grass80.bat set GRASS8=%OSGEO4W_ROOT%\bin\grass80.bat
修改 package-nightly.cmd,如下:
+ BUILDDIR改为与源代码目录同级的目录,即set BUILDDIR=%CD%\\..\\..\\..\build-%PACKAGENAME%-%ARCH%
+ 删除 call gdal-dev-env.bat
去掉 proj,gdal路径中的 apps/dev/ 改为
+ -D PROJ_LIBRARY=%O4W_ROOT%/lib/proj.lib
+ -D PROJ_INCLUDE_DIR=%O4W_ROOT%/include
+ -D GDAL_LIBRARY=%O4W_ROOT%/lib/gdal_i.lib
+ -D GDAL_INCLUDE_DIR=%O4W_ROOT%/include
修改 configonly.bat
CMAKEGEN=Visual Studio 14 2015 Win64 改为 CMAKEGEN=Visual Studio 17 2022
修改CMakeLists.txt
添加 set(PKG_CONFIG_EXECUTABLE “pathto/pkg-config.exe”)
编译
ms-windows/osgeo 目录下打开终端,执行configonly.bat
打开生成的qgis.sln
第一步先编译qgis_core工程。qgis_core以来qgis_core_autogen工程,qgisexpression_text.cpp.rule编译失败,提示init_fs_encoding相关错误,google找到原因,未设置PYTHONHOME环境变量
PYTHONHOME=C:\OSGeo4W\apps\Python39
qgis_core_autogen.rule编译失败,把 C:\OSGeo4W\apps\Qt5\bin;C:\OSGeo4W\bin; 加入path
zzz-db_manager-16-depend编译失败,提示from PyQt5.QtCore import QDir… DLL load failed,原因是依赖vs2019 runtime??
安装MSVC142 VS2019 C++ x64/x86 build tools 并重启电脑
编译成功后,复制一份qgis.sln,去掉test相关工程并保存。
tips
修改grass版本后清空编译目录,不然会缓存grass地址,cmake找不到grass