VS2022 编译 OpenCPN 开源电子海图 + 修改代码进行汉化
一、前言
OpenCPN 是一款广受欢迎的开源电子海图(ECDIS)软件,广泛应用于航海导航、航线规划等领域。对于航海爱好者、航海从业者以及相关开发者来说,能够编译和定制 OpenCPN,不仅可以获得更丰富的功能体验,还能根据自身需求进行个性化二次开发。本博文将详细介绍如何在 Windows 环境下,利用 Visual Studio 2022,从源码编译 OpenCPN,并讲解通过修改文件进行简单的汉化,帮助你打造属于自己的中文电子海图软件。
本教程适用于具备一定 Windows 基础知识的开发者或技术爱好者,无论你是想深度参与 OpenCPN 的开源协作,还是希望为本地化和中文化做出贡献,都可以通过本文掌握完整的操作流程。
参照官网Windows编译教程和自己踩的坑,给大家写了一篇博客,Android编译还没完全搞懂,但有了基本思路,在线求大佬带一下。
二、开发环境准备
在开始编译和汉化 OpenCPN 之前,需要先搭建好开发环境。以下是本流程所需的软件工具及相应准备工作:
1. 必备软件及安装
一键安装代码:
# 安装 Chocolatey 及基础依赖(管理员权限下)
Set-ExecutionPolicy Bypass -Scope Process -Force; `
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; `
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# 一件安装依赖等
choco install -y git cmake wget 7zip
请不要跳过检查环境的步骤!!!
Visual Studio 2022 社区版或更高版本
下载安装地址:Visual Studio 官网
安装时请勾选“使用C++的桌面开发”工作负载,以包含C++编译器和相关工具。
CMake
用于管理编译配置与生成 Visual Studio 项目文件。
下载安装地址:CMake 官网
Git
版本管理工具,用于获取 OpenCPN 源代码。
下载安装地址:Git 官网
wxWidgets
wxWidgets 在最新版本的批处理脚本中已经包含了下载到配置全流程的处理,做了很大的简化,但需要特定版本结合使用,需要查看配置文件。在后文中会详细提到,不用额外安装。
Poedit
便捷编辑和管理 .po 语言包文件,方便汉化。
下载安装地址:Poedit 官网
Chocolatey
用于包管理,方便自动补齐缺失的小组件。
打开PS,输入以下指令自动安装(这一步可能需要关某些工具):
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
执行完在PS中执行
choco
若显示版本号则说明配置成功,成功后,下载7zip用于批处理脚本的解压命令:
choco install 7zip
2. 重要准备步骤与环境配置
确保 CMake、Git、Poedit等bin环境均已添加到系统 PATH 环境变量中!!!
使用下面的代码进行检查:
git --version
cmake --version
强烈建议所有工具和源码路径均使用英文,并避免路径中出现空格或中文字符,以防编译过程中出错。
三、OpenCPN编译
1、源码
打开“x86 Native Tools Command Prompt for VS 2022”!!!
打开“x86 Native Tools Command Prompt for VS 2022”!!!
打开“x86 Native Tools Command Prompt for VS 2022”!!!
首先建立一个目录,cd到目录中作为项目根目录。使用下面的命令下载并更新项目:
git clone https://github.com/opencpn/opencpn
cd opencpn # 到clone下来的目录里
git submodule update --init --recursive # 更新子模块 请注意,这一步可能要多试几次才能完全成功
.\buildwin\winConfig.bat --debug --relwithdebinfo
在看到
这个提示的时候选择Y,让子弹飞一会儿~
2、wxWidgets环境安装
当出现下面图片的时候:
这是在提示找不到wxWidgets配置,执行下面的命令:
git clone --jobs 2 --depth 1 --recurse-submodules --shallow-submodules --branch v3.2.7 https://github.com/wxWidgets/wxWidgets 你的工作目录\ocpn_wxWidgets
这里的版本需求你可能需要在类似于以下目录的脚本中查看,可以将.bat 后缀换为.txt进行查看,再换回去
"D:\OpenCPN_VS\opencpn\buildwin\winConfig.bat"
如果在wxWidgetsclone过程中开梯子主目录已经下载完,但子模块还是不行,可以使用以下命令对wxWidgets的子模块进行逐个更新,可以先看一下下面的代替方案:
cd 你的工作目录\ocpn_wxWidgets
git submodule sync
git submodule update --init --recursive
对于有工具的用户,可以参考以下配置,这里的127.0.0.1代表的就是你本机的IP地址,因为服务就在你本机上运行
git config --global https.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
下载好wxWidgets模块后回到opencpn工作目录,继续工作。
3、字符集编码问题解决和sln项目生成
.\buildwin\winConfig.bat --debug --relwithdebinfo
当卡在
Could NOT find Shapelib (missing: SHAPELIB_LIBRARY SHAPELIB_INCLUDE_DIR)
的时候按下ctrl+C给一个中断,这个包可有可无
不出意外的话,会提示与字符集有关的错误,主要是因为下载的文件编码格式与VS不一致,导致“{”等符号错位了,就会报错,往往体现为C2001 & C1075 错误(代码格式或转义问题),别急,只要找到报错的文件使用UTF-8编码保存一下就可以了(“正体字”请换为英文),错误文件应该形如:
D:\OpenCPN_VS\opencpn\gui\src\hotkeys_dlg.cpp
这个文件直接将编码格式改为UTF-8 BOM
这是第一个报错
修改保存好文件(覆盖保存)之后,重新执行
.\buildwin\winConfig.bat --debug --relwithdebinfo
将遇到第二个文件内容导致的编译错误:
D:\OpenCPN_VS\opencpn\gui\src\options.cpp
打开ctrl+F 查找“正”,将“正体字”中文字符用英文代替。
这个文件直接将编码格式改为UTF-8
修改保存好文件(覆盖保存)之后,重新执行
.\buildwin\winConfig.bat --debug --relwithdebinfo
应该可以成功生成sln项目,注意此时控制台输出的内容并牢记。
四、项目运行、海图资源补充、简单汉化
1、项目运行地址
生成的项目文件位于类似于
"D:\OpenCPN_VS\opencpn\build\OpenCPN.sln"
的地方,打开生成项目,但建议你先阅读下面两个小节再打开项目,否则只能删除.ini文件,再全部重新生成了。
2、简单汉化
汉化其实很简单,在上文options.cpp中,我们修改了“正体字”部分,其实就应当敏锐的察觉到这里就是中文选项定义的地方。打开文件来到下图部分,取消注释简体中文就可以了!
3、海图资源加载
如果你没听劝,你会发现你的陆地不翼而飞,别急,下载官网资charts里的资源。
下载好解压到D:\OpenCPN_VS\opencpn\data\gshhs
目录下。
删除D:\OpenCPN_VS\opencpn\build\Debug下的opencpn.ini、*.xml、opencpn.log 文件,在sln中重新生成解决方案。
在这个界面停住!!添加底图资源文件目录为D:\OpenCPN_VS\opencpn\data\gshhs!!
在这个界面停住!!添加底图资源文件目录为D:\OpenCPN_VS\opencpn\data\gshhs!!
在这个界面停住!!添加底图资源文件目录为D:\OpenCPN_VS\opencpn\data\gshhs!!
相信到这里你已经编译出自己的OpenCPN了。