ecCodes学习笔记:Windows下编译ecCodes

目录

ecCodes 是由 ECMWF 开发的气象数据解码软件,支持 GRIB 和 BURF 格式,是ECMWF 之前开发的 GRIB 解码工具 GRIB-API 的升级版。
与 GRIB-API 一样,ecCodes 提供 WINDOWS 下缩减版的编译方式,只包含核心库和一些命令行工具,不支持 Fortran 和 Python 接口。下面介绍下 Windows 版的编译方式。

准备

GRIB 2 文件一般使用 JPEG 2000 算法压缩数据,所以需要 JPEG 解码库 JasperOpenJPEG
2.X 版本的 Jasper 支持 CMake,可以直接在 Windows 下编译。OpenJPEG 同样支持 CMake 编译,而且还提供 Windows 的预编译包,可以直接使用。
下面使用 OpenJPEG 的二进制包编译 ecCodes。

编译 grib_api_lib

ecCodes 源码目录中包含 Visual Studio 的解决方案文件,位于 windows/msvc/grib_api.sln。我使用 Visual Studio 2017 打开。
默认平台方案是 Win32,建议新建 x64 方案平台,编译 64 位版本。
在 grib_api_lib 中设置预处理器变量:

HAVE_JPEG
USE_JPEG2000
HAVE_LIBOPENJPEG

添加 OpenJPEG 的 indclude 目录到附加包含目录。
现在还不能直接编译程序,会提示缺少头文件 eccodes_version.h。
该文件应该由 CMake 自动生成,可以在cygwin环境中使用cmake生成,或者直接在源码目录src下面添加 eccodes_version.h 文件,内容如下:

/*
 * Copyright 2005-2017 ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at //www.apache.org/licenses/LICENSE-2.0.
 *
 * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
 * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
 */
#ifndef eccodes_version_H
#define eccodes_version_H
#define ECCODES_VERSION_STR      "2.6.0"
#define ECCODES_MAJOR_VERSION    2
#define ECCODES_MINOR_VERSION    6
#define ECCODES_REVISION_VERSION 0
#define ECCODES_VERSION (ECCODES_MAJOR_VERSION*10000+ECCODES_MINOR_VERSION*100+ECCODES_REVISION_VERSION)
#endif /* eccodes_version_H */

注意内容与 ecCodes 源码版本有关。这样就可以编译 grib_api_lib 了。

编译命令行工具

以 grib_ls 为例说明命令行工具的编译。
将 OpenJPEG 的库目录加入链接器的附加库目录中,并将 openjp2.lib 库文件加入到链接器的附加依赖项中,然后就能编译 grib_ls 项目。

调试

使用二进制 OpenJPEG 包编译的 grib_ls 在运行时需要动态链接 openjp2.dll 库,因此在 VS 中调试项目时需要将 OpenJPEG 的 bin 目录添加到项目的环境变量中。
在项目属性 -> 调试 -> 环境中设置 Path 变量。例如

Path=D:\lib\cpp\openjpeg\openjpeg-v2.3.0-windows-x64\bin;$(Path)

在项目属性 -> 调试 -> 命令参数中添加 grib_ls 的参数,就可以调试 grib_ls 程序了。

使用 ecCodes 库

官方示例文件中使用 r 模式打开文件,但在 Windows 下必须使用 rb; 二进制模式打开文件,才能正确解析 GRIB 2 消息,否则会出错。