Linux | 编译convert_geotiff 遇到的问题

文摘   2024-12-04 19:45   北京  

写在前面

师弟有个需求:对于WRF的地形文件,将其转换为更高分辨率的数据,参考网上的教程,已经解决了80%的问题。其中,需要编译一个convert_geotiff程序,这里记录一下在Linux系统上的编译过程。有几个比较坑的地方,由于我这里用的Linux版本太老了。

步骤1:安装libgeotiff-dev

在ubuntu上,安装命令为:

sudo apt-get install libgeotiff-dev

在macos上,安装命令为:

brew install libgeotiff

在Linux上安装命令为:

sudo yum install libgeotiff-devel

注意,这里需要管理员权限

步骤2:下载编译的安装包

wget https://github.com/openwfm/convert_geotiff/releases/download/v0.1/convert_geotiff-0.1.0.tar.gz

步骤3:解压安装包

  • 解压
 tar -zxvf convert_geotiff-0.1.0.tar.gz
  • 进入解压后的文件夹
cd convert_geotiff-0.1.0/ 

步骤4: 进行编译

编译命令为:

./configure && make

这里我这里出现报错了,所以分开来debug,首先./configure,这里出现一个问题是:Cannot find GEOTIFF headers

checking for geotiff/geotiffio.h... no
configure: error: Cannot find GEOTIFF headers

主要是找不到geotiffio.h这个文件,这里通过locate命令进行查找,

locate geotiffio.h

发现是存在的,位置为:

"/usr/include/libgeotiff/geotiffio.h"

所以这里需要在环境配置脚本~/.zshrc里面指定该位置:

export CFLAGS="-I/usr/include/libgeotiff"
export LDFLAGS="-L/usr/include/libgeotiff/"

添加之后,source ~/.zshrc使脚本生效,再次编译,显示成功,这里有个警告但是不影响后续使用

步骤5:构建程序

上面相关环境配置好之后,进行构建,使用命令:make,又出错了,错误提示为:

gcc  -I/usr/include/libgeotiff  -L/usr/lib64 -o convert_geotiff convert_geotiff.o geogrid_tiles.o read_geotiff.o write_geogrid.o  -lgeotiff -ltiff
/usr/bin/ld: geogrid_tiles.o: undefined reference to symbol 'ceil@@GLIBC_2.2.5'
//usr/lib64/libm.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [convert_geotiff] Error 1

主要的错误信息为:

/usr/bin/ld: geogrid_tiles.o: undefined reference to symbol 'ceil@@GLIBC_2.2.5'

网上搜索的解决方案为:

  • 为了链接 libm,你需要添加-lm 参数

所以,这里找到生成的Makefile文件,通常,Makefile 会指定编译器和链接器的选项,你可以在其中找到 LDFLAGSLIBS 变量。

vi Makefile

搜索LDFLAGS,在这里,原本的我的LIBS后面为

LIBS = -lgeotiff -ltiff

这里进行修改,添加-lm,修改为

LIBS = -lgeotiff -ltiff -lm

修改后,保存,再次运行make,显示了以下信息:

gcc  -I/usr/include/libgeotiff  -L/usr/lib64 -o convert_geotiff convert_geotiff.o geogrid_tiles.o read_geotiff.o write_geogrid.o  -lgeotiff -ltiff -lm

然后,就发现编译好了,存在了convert_geotiff可执行程序

测试程序,是可以正常有提示信息的

步骤6: 测试程序

这里对编译好的数据进行测试,新建一个文件夹,选择一个任意的tiff文件,调用相关命令

mkdir topo3s &&  cd topo3s && cp "/Users/xxx/srtm_jiangsu/srtm_jiangsu.tif" .

进行高分辨率数据转换:

../convert_geotiff -w 4 -t 1500 -u "meters MSL" -d "3s topography" -b 0 -m -32768   "/Users/xxx/srtm_jiangsu/srtm_jiangsu.tif"

运行结束后生成以下文件:

总结

由于没有完整的看相关高分辨率转换的过程,所以这里只涉及编译convert-geotiff的问题。此外,经过测试,我发现在自己的wsl上编译这个更简单一点,完全没有我在Linux上遇到这么多坑的地方。所以,如果是刚需的话,还是建议在Ubuntu上进行编译。我这里的Linux上的gcc太老了,4.8的版本感觉要被淘汰了。

https://stackoverflow.com/questions/16006145/ld-undefined-reference-to-symbol-log2glibc-2-2-5

https://blog.csdn.net/u012351051/article/details/109097970

https://forum.mmm.ucar.edu/threads/resolved-why-high-resolution-terrain-data-does-not-match-actual-altitude%EF%BC%9F.16095/

https://github.com/openwfm/convert_geotiff?tab=readme-ov-file


气python风雨
主要发一些涉及大气科学的Python文章与个人学习备忘录
 最新文章