gdal3.3.1源码(linux)编译 Centos8.3机器上源码编译遇到的坑。

如果您需要windows 源码编译 gdal3.3.1 请进入连接:https://blog.csdn.net/qd1308504206/article/details/114585267

一、源码下载proj和sqlite和gdal:

本次下载的是proj版本是proj 8.1.0

下载地址:https://download.osgeo.org/proj/proj-8.1.0.tar.gz

sqlite是sqlite3.36

https://www.sqlite.org/2021/sqlite-amalgamation-3360000.zip

gdal 是 gdal3.3.1

https://github.com/OSGeo/gdal/releases/download/v3.3.1/gdal-3.3.1.tar.gz

同样的将sqlite-amalgamation-3360000和proj-8.1.0和gdal-3.3.1放到同级目录

二、源码修改和编译sqlite 3.36.0:

为了让大家少走弯路。这里就不说报错和解决错误的过程了,下面直接给出最终的解决方案

2.1 源码修改

在文件夹sqlite-amalgamation-3360000文件夹下新建文件sqliteconfig.h 内容如下

#pragma once
#ifdef SQLITECONFIG_H
#define SQLITE_ENABLE_RTREE 1
#define SQLITE_ENABLE_COLUMN_METADATA 1
#define SQLITE_HAS_CODEC 1
//#define SQLITE_THREADSAFE 2
#endif

然后在文件sqlite3.h 和 sqlite3.c 两个文件中同时包含sqliteconfig.h文件。

./sqlite3.h:40:#include “sqliteconfig.h”
./sqlite3.c:25:#include “sqliteconfig.h”

注意这里必须 要两个都include。如果只是sqlite3.h包含,后面会报错

2.2 sqlite 3.36.0源码编译

gcc shell.c sqlite3.c -lpthread -ldl -o sqlite3

gcc -c sqlite3.c -lpthread -ldl -o sqlite3.o -DSQLITECONFIG_H
ar -r libsqlite3.a sqlite3.o

gcc -o libsqlite3.so -fPIC –shared sqlite3.c -DSQLITECONFIG_H

上面四条命令,第一行为生成sqlite3可执行文件。

第二行和第三行,生成libsqlite3.a 静态库文件

第四行,生成libsqlite3.so动态库文件

gdal3.3.1源码(linux)编译 Centos8.3机器上源码编译遇到的坑。

三、源码编译proj 8.1.0:

新建生成文件的路径,例如生成文件夹为 proj 8.1.0/build

mkdir proj 8.1.0/build/bin

cp -f ../sqlite-amalgamation-3360000/sqlite3 build/bin/sqlite3
cp -f ../sqlite-amalgamation-3360000/libsqlite3.* build/bin/

将上面生成的sqlite的三个文件复制到bin目录下

cmake . -DSQLITE3_INCLUDE_DIR=$(pwd)/../sqlite-amalgamation-3360000 -DSQLITE3_LIBRARY=$(pwd)/../sqlite-amalgamation-3360000/libsqlite3.so -DENABLE_CURL=OFF -DENABLE_TIFF=OFF -DBUILD_PROJSYNC=OFF -DBUILD_TESTING=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS=”-lpthread” -DCMAKE_INSTALL_PREFIX=build/ -DBUILD_CCT=OFF -DBUILD_CS2CS=OFF -DBUILD_GEOD=OFF -DBUILD_GIE=OFF -DBUILD_PROJ=OFF -DCMAKE_C_FLAGS=-fPIC -DCMAKE_CXX_FLAGS=-fPIC

然后make && make install 就可以了。

这里 详细解释下cmake的选项。

-DSQLITE3_INCLUDE_DIR=$(pwd)/../sqlite-amalgamation-3360000

sqlite3头文件的路径,注意最后面没有斜杠

-DSQLITE3_LIBRARY=$(pwd)/../sqlite-amalgamation-3360000/libsqlite3.so

sqlite3库的路径

-DENABLE_CURL=OFF -DENABLE_TIFF=OFF -DBUILD_PROJSYNC=OFF -DBUILD_TESTING=OFF

我这里使用目前用不到CURL 同时TIFF库也不用。也不需要编译测试用例。

注意这里默认是编译测试用例的,需要联网下载googletest 然后巴拉巴拉。

-DCMAKE_BUILD_TYPE=Release

这里只编译release

-DCMAKE_C_FLAGS=”-lpthread”

连接线程库

-DCMAKE_INSTALL_PREFIX=build/

生成文件的目标路径。

-DBUILD_CCT=OFF -DBUILD_CS2CS=OFF -DBUILD_GEOD=OFF -DBUILD_GIE=OFF -DBUILD_PROJ=OFF

取消一些不需要的选项,减少so文件的大小。

-DCMAKE_C_FLAGS=-fPIC -DCMAKE_CXX_FLAGS=-fPIC

生成动态库修复一些连接错误。

gdal3.3.1源码(linux)编译 Centos8.3机器上源码编译遇到的坑。

常见错误可以仔细查看cmake的error.log 既然入了这一行,对于错误提示一定要认真看,认真分析。

四、源码编译gdal 3.3.1

4.1 前提准备

在当前文件夹下新建文件夹gdallinux,作为gdal的输出目录,gdallinux 和 gdal 3.3.1文件夹同级

gdallinux新建文件夹sqlite3,并且将sqlite3的相关文件拷贝到相应的位置。详细如下

gdal3.3.1源码(linux)编译 Centos8.3机器上源码编译遇到的坑。

我们现在可以将文件夹 gdallinux/sqlite3 作为sqlite的文件夹输出路径

proj 8.1.0/build 作为proj8.1.0的输出路径。

4.2 环境设置

export LIBS=”-lpthread -ldl”

export GDAL_HOME=$(pwd)/gdallinux

export CXXFLAGS=’-DSQLITECONFIG_H -fPIC -Wl,-rpath .’

export CFLAGS=’-DSQLITECONFIG_H -fPIC -Wl,-rpath .’

上面四行,第一行设置LIBS 主要编译sqlite3的时候的依赖文件

第二行是指定GDAL的输出目录

第三行和第四行,首先定义宏定义SQLITECONFIG_H 是为了包含sqlite3的相关宏定义。

4.3 配置编译

chmod +x ./configure

./configure –with-sqlite3=$sqlitedir \
–build= \
–enable-shared=yes \
–enable-static=no \
–with-proj=$(pwd)/../proj-8.1.0/build

chmod +x gcore/*.sh

make && make install

4.5 常见错误和修改

第一个:sqlite相关的一个编译错误

修改configure文件中的 LIBS=””

注释掉这一行,大概在24761行

第二个:

(cd apps; make appslib)
make[1]: 进入目录"/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/apps"
make[1]: 对"appslib"无需做任何事。
make[1]: 离开目录"/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/apps"
make /home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/libgdal.a /home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/libgdal_geostar.so
make[1]: 进入目录"/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1"
make[1]: "/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/libgdal.a"已是最新。
make[1]: "/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/libgdal_geostar.so"已是最新。
make[1]: 离开目录"/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1"
(cd apps; make)
make[1]: 进入目录"/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/apps"
g++  gdalinfo_bin.o  -L/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1 -lgdal  -o gdalinfo
/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/libgdal.a(geotiff.o):在函数'GTiffOneTimeInit'中:
geotiff.cpp:(.text+0x33060):对'dlsym'未定义的引用
/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/libgdal.a(gt_wkt_srs.o):在函数'GTIFGetOGISDefnAsOSR'中:
gt_wkt_srs.cpp:(.text+0x3031):对'proj_create_from_database'未定义的引用
gt_wkt_srs.cpp:(.text+0x3051):对'proj_get_name'未定义的引用
gt_wkt_srs.cpp:(.text+0x308a):对'proj_destroy'未定义的引用
gt_wkt_srs.cpp:(.text+0x3200):对'proj_uom_get_info_from_database'未定义的引用
/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/libgdal.a(gt_wkt_srs.o):在函数'OGCDatumName2EPSGDatumCode(gtiff*, char const*)'中:
gt_wkt_srs.cpp:(.text+0x3827):对'proj_create_from_name'未定义的引用
gt_wkt_srs.cpp:(.text+0x3846):对'proj_list_get_count'未定义的引用
gt_wkt_srs.cpp:(.text+0x387f):对'proj_list_get'未定义的引用
gt_wkt_srs.cpp:(.text+0x389a):对'proj_get_name'未定义的引用
gt_wkt_srs.cpp:(.text+0x38e9):对'proj_get_id_code'未定义的引用
gt_wkt_srs.cpp:(.text+0x391b):对'proj_destroy'未定义的引用
gt_wkt_srs.cpp:(.text+0x3930):对'proj_list_destroy'未定义的引用
/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/libgdal.a(gt_wkt_srs.o):在函数'GTIFSetFromOGISDefnEx'中:
gt_wkt_srs.cpp:(.text+0x3fa3):对'proj_create_from_name'未定义的引用
gt_wkt_srs.cpp:(.text+0x3fbe):对'proj_list_get_count'未定义的引用
gt_wkt_srs.cpp:(.text+0x3feb):对'proj_list_get'未定义的引用
gt_wkt_srs.cpp:(.text+0x4007):对'proj_get_id_code'未定义的引用
gt_wkt_srs.cpp:(.text+0x4033):对'proj_destroy'未定义的引用
gt_wkt_srs.cpp:(.text+0x403f):对'proj_list_destroy'未定义的引用
/home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/libgdal.a(hfadataset.o):在函数'HFAPCSStructToWKT(Eprj_Datum const*, Eprj_ProParameters const*, Eprj_MapInfo const*, HFAEntry*)'中:

这个错误是编译过程中,编译apps这个文件夹的时候,报错了。

那么明显第一个错误:对’dlsym’未定义的引用 ,本质原因应该加连接 -ldl

下面proj和sqlite3相关的错误就是没有连接成功 -lproj -lsqlite3 还有相应的路径。

先说解决方案:修改文件中:144行

GDAL_SLIB_LINK = -L$(GDAL_ROOT) -lgdal

改为:

GDAL_SLIB_LINK = -L$(GDAL_ROOT) -lgdal $(LIBS)

解决方案的步骤

cd apps

make -p 将结果打印到文件或者log中,

然后解读log中变量个含义。期间我还一直怀疑是apps目录下gdal-config文件导致的。

下面由于log太长,只是截取了片段。反正就是所有变量的值都可以看得到。并且可以看到是哪一行赋值的。

makefile (从“../GDALmake.opt”,行 29)
INSTALL = $(LIBTOOL_INSTALL) $(GDAL_ROOT)/install-sh -c
makefile (从“../GDALmake.opt”,行 84)
NO_UNUSED_PARAMETER_FLAG = -Wno-unused-parameter
自动
@D = $(patsubst %/,%,$(dir $@))
makefile (从“../GDALmake.opt”,行 115)
EXE =
自动
@F = $(notdir $@)
默认
MAKE_VERSION := 4.2.1
makefile
CURDIR := /home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/apps
makefile (从“../GDALmake.opt”,行 9)
SHELL = /bin/sh
makefile (从“../GDALmake.opt”,行 28)
RM = $(LIBTOOL_CLEAN) /bin/rm -f *.lo
默认
CO = co
makefile (从“../GDALmake.opt”,行 296)
HAVE_OCI = no
默认
COMPILE.mod = $(M2C) $(M2FLAGS) $(MODFLAGS) $(TARGET_ARCH)
makefile (从“../GDALmake.opt”,行 307)
SFCGAL_CFLAGS =
makefile (从“../GDALmake.opt”,行 443)
LIBDEFLATE_SETTING = no
环境
_ = /usr/bin/make
默认
PREPROCESS.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -F
makefile (从“../GDALmake.opt”,行 326)
FGDB_INC =
makefile (从“../GDALmake.opt”,行 218)
SQLITE_INC = -I/home/gskernel_a/wyb/40_Source/dependency/gdallinux/sqlite/include
makefile (从“../GDALmake.opt”,行 444)
LIBLZMA_SETTING = no
默认
LINK.m = $(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
makefile (从“../GDALmake.opt”,行 346)
ARCOBJECTS_LIB = @ARCOBJECTS_LIB@
默认
LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH)
默认
OUTPUT_OPTION = -o $@
makefile (从“../GDALmake.opt”,行 258)
MRSID_LIDAR_INCLUDE =
makefile (从“../GDALmake.opt”,行 347)
ARCOBJECTS_INC = @ARCOBJECTS_INC@
makefile (从“../GDALmake.opt”,行 297)
OCI_INCLUDE =
makefile (从“../GDALmake.opt”,行 513)
GDAL_LIBS := /home/gskernel_a/wyb/40_Source/dependency/gdal-3.3.1/libgdal.a
默认
COMPILE.cpp = $(COMPILE.cc)
makefile (从“../GDALmake.opt”,行 340)
MONGOCXXV3_CFLAGS =
makefile (从“../GDALmake.opt”,行 130)
LIBGDAL_CURRENT := 29
makefile (从“../GDALmake.opt”,行 1)
MAKEFILE_LIST :=  GNUmakefile ../GDALmake.opt
makefile (从“../GDALmake.opt”,行 73)
INST_MAN = ${datarootdir}/man
makefile (从“../GDALmake.opt”,行 522)
JAVA_HOME =
makefile (从“../GDALmake.opt”,行 203)
NETCDF_HAS_HDF4 =
makefile (从“../GDALmake.opt”,行 316)
GRASS_SETTING = no
makefile (从“../GDALmake.opt”,行 458)
RASDAMAN_ENABLED = no
makefile (从“../GDALmake.opt”,行 571)
HAVE_OPENSSL_CRYPTO = no
环境
HISTCONTROL = ignoredups
makefile (从“../GDALmake.opt”,行 333)
MONGODB_INC =
makefile (从“../GDALmake.opt”,行 379)
PCIDSK_LIB =
makefile (从“../GDALmake.opt”,行 560)
HEIF_CFLAGS =
环境
GS_CLUSTER_NAME = dbCluster
默认
LINK.p = $(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
makefile (从“../GDALmake.opt”,行 201)

4.6 重要知识点 在linux环境中设置路径的地方,都不要带最后面的斜杠。

Original: https://blog.csdn.net/qd1308504206/article/details/120154787
Author: qd1308504206
Title: gdal3.3.1源码(linux)编译 Centos8.3机器上源码编译遇到的坑。

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/817456/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球