如果您需要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动态库文件
三、源码编译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
生成动态库修复一些连接错误。
常见错误可以仔细查看cmake的error.log 既然入了这一行,对于错误提示一定要认真看,认真分析。
四、源码编译gdal 3.3.1
4.1 前提准备
在当前文件夹下新建文件夹gdallinux,作为gdal的输出目录,gdallinux 和 gdal 3.3.1文件夹同级
gdallinux新建文件夹sqlite3,并且将sqlite3的相关文件拷贝到相应的位置。详细如下
我们现在可以将文件夹 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/
转载文章受原作者版权保护。转载请注明原作者出处!