gdal-3.3.1 linux(Ubuntu) 编译(附SQLite3 PROJ6编译)

文章目录

想用GDAL/OGR功能,折腾了一晚,把步骤记录下来,供以后参考。以下内容是在原文的基础上验证,修改了一些bug。

1 官网下载GDAL源码

可以去官网下载,也可以到下载,后者还提供源码和编译好的文件下载(Debian版本),我用的官网的源码进行的编译。

2 解压源码并安装

(可参考https://www.cnblogs.com/charlee44/archive/2017/05/21/6886442.html)。将得到的源码解压:tar -zxvf gdal-3.3.1.tar.gz ,进入解压后的目录,配置安装目录,我配置在/home/zhoujianwen/gdal-3.3.1/build目录下,按照参考说的额,配置安装目录,生成makefile文件,执行命令:

cd gdal-3.3.1/
 sudo mkdir build
 sudo ./configure --prefix=/home/zjw/gdal-3.3.1/build

问题来了:

checking for PROJ >= 6 library... checking for proj_create_from_wkt in -lproj... no
checking for internal_proj_create_from_wkt in -lproj... no
checking for internal_proj_create_from_wkt in -linternalproj... no
configure: error: PROJ 6 symbols not found

百度搜索,原来GDAL/OGR 3.x版本需要PROJ6的支持,还是得先解决PROJ6的问题。

3 下载编译PROJ6

官网下载PROJ,已经8.x版本了,为求保险兼容,还是选择6.x版本下载吧。(注:对于官网中对于linux debian版本直接安装: sudo apt-get install proj-bin我试了下,没有成功,不知道怎么回事,还是采用源码编译方式。)我下载的6.3.2版本,源码可以用cmake生成编译文件,也可以直接用GUN Make编译,我选用后者。
解压后,进入解压目录,配置安装路径,生成makefile,请参考。

 tar -zxvf proj-8.1.0.tar.gz
 cd proj-8.1.0
 sudo mkdir build
 sudo ./configure --prefix=/home/zjw/proj-8.1.0/build

问题又来了:

No package 'sqlite3' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables SQLITE3_CFLAGS
and SQLITE3_LIBS to avoid the need to call pkg-config.

See the pkg-config man page for more details.

4 编译安装SQLite3

官网下载 sqlite-autoconf-3360000.tar.gz 解压、进入解压目录、配置安装目录,生成makefile:

tar -zxvf sqlite-autoconf-3360000.tar.gz
cd sqlite-autoconf-3360000/
sudo mkdir build
sudo ./configure --prefix=/home/zjw/sqlite-autoconf-3360000/build

继续编译,安装:

sudo make
sudo make install

/home/zjw/sqlite-autoconf-3360000目录下,会生成bin、include、lib、share四个目录,编译安装成功。终于不用再依赖其他的东西了-_-!!!

gdal-3.3.1 linux(Ubuntu) 编译(附SQLite3 PROJ6编译)

最终安装信息如下:

(base) zjw@node1:~/sqlite-autoconf-3360000$ sudo make install
make[1]: Entering directory '/home/zjw/sqlite-autoconf-3360000'
 /bin/mkdir -p '/home/zjw/sqlite-autoconf-3360000/build/lib'
 /bin/bash ./libtool   --mode=install /usr/bin/install -c   libsqlite3.la '/home/zjw/sqlite-autoconf-3360000/build/lib'
libtool: install: /usr/bin/install -c .libs/libsqlite3.so.0.8.6 /home/zjw/sqlite-autoconf-3360000/build/lib/libsqlite3.so.0.8.6
libtool: install: (cd /home/zjw/sqlite-autoconf-3360000/build/lib && { ln -s -f libsqlite3.so.0.8.6 libsqlite3.so.0 || { rm -f libsqlite3.so.0 && ln -s libsqlite3.so.0.8.6 libsqlite3.so.0; }; })
libtool: install: (cd /home/zjw/sqlite-autoconf-3360000/build/lib && { ln -s -f libsqlite3.so.0.8.6 libsqlite3.so || { rm -f libsqlite3.so && ln -s libsqlite3.so.0.8.6 libsqlite3.so; }; })
libtool: install: /usr/bin/install -c .libs/libsqlite3.lai /home/zjw/sqlite-autoconf-3360000/build/lib/libsqlite3.la
libtool: install: /usr/bin/install -c .libs/libsqlite3.a /home/zjw/sqlite-autoconf-3360000/build/lib/libsqlite3.a
libtool: install: chmod 644 /home/zjw/sqlite-autoconf-3360000/build/lib/libsqlite3.a
libtool: install: ranlib /home/zjw/sqlite-autoconf-3360000/build/lib/libsqlite3.a
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig -n /home/zjw/sqlite-autoconf-3360000/build/lib
 /bin/mkdir -p '/home/zjw/sqlite-autoconf-3360000/build/bin'
  /bin/bash ./libtool   --mode=install /usr/bin/install -c sqlite3 '/home/zjw/sqlite-autoconf-3360000/build/bin'
libtool: install: /usr/bin/install -c sqlite3 /home/zjw/sqlite-autoconf-3360000/build/bin/sqlite3
 /bin/mkdir -p '/home/zjw/sqlite-autoconf-3360000/build/include'
 /usr/bin/install -c -m 644 sqlite3.h sqlite3ext.h '/home/zjw/sqlite-autoconf-3360000/build/include'
 /bin/mkdir -p '/home/zjw/sqlite-autoconf-3360000/build/share/man/man1'
 /usr/bin/install -c -m 644 sqlite3.1 '/home/zjw/sqlite-autoconf-3360000/build/share/man/man1'
 /bin/mkdir -p '/home/zjw/sqlite-autoconf-3360000/build/lib/pkgconfig'
 /usr/bin/install -c -m 644 sqlite3.pc '/home/zjw/sqlite-autoconf-3360000/build/lib/pkgconfig'

环境变量设置

vim ~/.bashrc

添加以下语句
export PATH=/home/zjw/sqlite-autoconf-3360000/build/bin:$PATH
export LD_LIBRARY_PATH=/home/zjw/sqlite-autoconf-3360000/build/lib:$LD_LIBRARY_PATH
或
export PATH=/home/zjw/sqlite-autoconf-3360000/build/bin:$PATH
export SQLITE3_CFLAGS=/home/zjw/sqlite-autoconf-3360000/build/include
export SQLITE3_LIBS=/home/zjw/sqlite-autoconf-3360000/build/lib
保存退出

最后永久更新
source ~/.bashrc
echo $PATH
输出
/home/zjw/sqlite-autoconf-3360000/build/bin:/home/zjw/bin:/home/zjw/.local/bin:/home/zjw/anaconda3/bin:/home/zjw/anaconda3/condabin:/home/wml/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/usr/local/go/pkg/tool:/home/zjw/sqlite-autoconf-3360000/build/bin:/home/zjw/sqlite-autoconf-3360000/build/bin:/home/zjw/sqlite-autoconf-3360000/build/bin
echo $SQLITE3_CFLAGS
echo $SQLITE3_LIBS
输出
/home/zjw/sqlite-autoconf-3360000/build/include
/home/zjw/sqlite-autoconf-3360000/build/lib

5 继续编译PROJ6

回到proj6解压目录,本以为编译好SQLite3,设置好提示中的PKG_CONFIG_PATH、SQLITE3_CFLAGS、SQLITE3_LIBS、PATH变量,告诉去哪里找头文件,去哪里链接动态库就可以了,但是还是提示错误。(猜想:在命令窗口直接export环境变量只针对当前窗口,是不是放到/etc/profile里面可以解决?没试,可能性也不大感觉,还是按下面步骤做吧。)

sudo ./configure --prefix=/home/zjw/proj-8.1.0/build

提示错误信息
configure: error: Please install sqlite3 binary.

有可能是刚才的 $SQLITE3_LIBS 设置的变量路径无法搜索到库文件,建议更新一下应该就可以跳过 “继续安装依赖:” 这一步。

export SQLITE3_LIBS=/home/zjw/sqlite-autoconf-3360000/build/lib/libsqlite3.la

继续安装依赖:

sudo apt-get install sqlite3

再次执行

bash
sudo ./configure --prefix=/home/zjw/proj-8.1.0/build
sudo make
sudo make install
</code></pre>
<p>成功!!!
<img alt="gdal-3.3.1 linux(Ubuntu) 编译(附SQLite3 PROJ6编译)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230809/51b403c2626c4c28bd97ea40e28a398b.png" /></p>
<p>设置环境变量</p>
<pre><code class="language-bash">vim ~/.bashrc
添加
export PATH=/home/zjw/proj-8.1.0/build/bin:$PATH
保存退出

source ~/.bashrc
</code></pre>
<h2>6 继续编译GDAL</h2>
<p>设置PATH将PROJ6的bin目录加入环境变量(这一步不知道需不需要,我是加上了,没试没加的情况,有可能也行,因为后边还要设置依赖的文件目录)、编译依赖文件,即上一步编译的结果。</p>
<pre><code class="language-bash">sudo ./configure --with-proj=/home/zjw/proj-8.1.0/build --prefix=/home/zjw/gdal-3.3.1/build
</code></pre>
<p><img alt="gdal-3.3.1 linux(Ubuntu) 编译(附SQLite3 PROJ6编译)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230809/e30b9208a6ed4e02ad117644d038d0cc.png" /></p>
<pre><code class="language-bash">sudo make
</code></pre>
<p>最后显示</p>
<pre><code class="language-bash">echo 'CONFIG_VERSION=' ./VERSION'' >> gdal.pc
echo 'CONFIG_INST_PREFIX=/home/zjw/gdal-3.3.1/build' >> gdal.pc
echo 'CONFIG_INST_LIBS=-L/home/zjw/gdal-3.3.1/build/lib -lgdal' >> gdal.pc
echo 'CONFIG_INST_CFLAGS=-I/home/zjw/gdal-3.3.1/build/include' >> gdal.pc
echo 'CONFIG_INST_DATA=/home/zjw/gdal-3.3.1/build/share/gdal' >> gdal.pc
</code></pre>
<p>再执行一次</p>
<pre><code>sudo make install     # 安装
</code></pre>
<p>查找一下gdal.pc,默认是在 <code>./build/lib/pkgconfig/gdal.pc</code>
查看gdal.pc内容, <code>cat ./build/lib/pkgconfig/gdal.pc</code></p>
<pre><code class="language-bash">CONFIG_VERSION=3.3.1
CONFIG_INST_PREFIX=/home/zjw/gdal-3.3.1/build
CONFIG_INST_LIBS=-L/home/zjw/gdal-3.3.1/build/lib -lgdal
CONFIG_INST_CFLAGS=-I/home/zjw/gdal-3.3.1/build/include
CONFIG_INST_DATA=/home/zjw/gdal-3.3.1/build/share/gdal
prefix=${CONFIG_INST_PREFIX}
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${exec_prefix}/include
datadir=${CONFIG_INST_DATA}

Name: libgdal
Description: Geospatial Data Abstraction Library
Version: ${CONFIG_VERSION}
Libs: ${CONFIG_INST_LIBS}
Cflags: ${CONFIG_INST_CFLAGS}
</code></pre>
<p>复制文件到 <code>/usr/lib/pkgconfig</code></p>
<pre><code class="language-bash">cp /home/zjw/gdal-3.3.1/build/lib/pkgconfig/gdal.pc  /usr/lib/pkgconfig
</code></pre>
<p>把 gdal.pc 文件放到 <code>/usr/lib/pkgconfig</code>路径下
在 linux 下通过 pkg-config 自动获取编译连接路径,可以正常运行了。
试一试看看能否读取路径信息</p>
<pre><code class="language-bash">pkg-config --libs --cflags gdal
显示如下
-I/home/zjw/gdal-3.3.1/build/include -L/home/zjw/gdal-3.3.1/build/lib -lgdal
</code></pre>
<p>使用 pkg-config 的 –cflags 参数可以给出在编译时所需要的选项,而 –libs 参数可以给出连接时的选项。例如,假设一个 sample.c 的程序用到了 glib 库,就可以这样编译:</p>
<pre><code class="language-bash">$ gcc -c -config –cflags glib-2.0 sample.c
</code></pre>
<p>然后这样连接:</p>
<pre><code class="language-bash">$ gcc sample.o -o sample -config –libs glib-2.0
</code></pre>
<p>或者上面两步也可以合并为以下一步:</p>
<pre><code class="language-bash">$ gcc sample.c -o sample -config –cflags –libs glib-2.0`

关于 pkg-config 认识

pkg-config&#x63D0;&#x4F9B;&#x4E86;&#x4E0B;&#x9762;&#x51E0;&#x4E2A;&#x529F;&#x80FD;&#xFF1A;

&#x68C0;&#x67E5;&#x5E93;&#x7684;&#x7248;&#x672C;&#x53F7;&#x3002;&#x5982;&#x679C;&#x6240;&#x9700;&#x8981;&#x7684;&#x5E93;&#x7684;&#x7248;&#x672C;&#x4E0D;&#x6EE1;&#x8DB3;&#x8981;&#x6C42;&#xFF0C;&#x5B83;&#x4F1A;&#x6253;&#x5370;&#x51FA;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#xFF0C;&#x907F;&#x514D;&#x94FE;&#x63A5;&#x9519;&#x8BEF;&#x7248;&#x672C;&#x7684;&#x5E93;&#x6587;&#x4EF6;&#x3002;
&#x83B7;&#x5F97;&#x7F16;&#x8BD1;&#x9884;&#x5904;&#x7406;&#x53C2;&#x6570;&#xFF0C;&#x5982;&#x5B8F;&#x5B9A;&#x4E49;&#xFF0C;&#x5934;&#x6587;&#x4EF6;&#x7684;&#x4F4D;&#x7F6E;&#x3002;
&#x83B7;&#x5F97;&#x94FE;&#x63A5;&#x53C2;&#x6570;&#xFF0C;&#x5982;&#x5E93;&#x53CA;&#x4F9D;&#x8D56;&#x7684;&#x5176;&#x5B83;&#x5E93;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x6587;&#x4EF6;&#x540D;&#x53CA;&#x5176;&#x5B83;&#x4E00;&#x4E9B;&#x8FDE;&#x63A5;&#x53C2;&#x6570;&#x3002;
&#x81EA;&#x52A8;&#x52A0;&#x5165;&#x6240;&#x4F9D;&#x8D56;&#x7684;&#x5176;&#x5B83;&#x5E93;&#x7684;&#x8BBE;&#x7F6E;&#x3002;

当然除了在编译时使用pkg-config,还可以使用以下方式操作
gdal设置path搜索路径

vim ~/.bashrc
export PATH=/home/zjw/gdal-3.3.1/build/bin:$PATH
source ~/.bashrc
(base) zjw@node1:~/gdal-3.3.1/build/bin$ gdalinfo --version
GDAL 3.3.1, released 2021/06/28

gdal设置include搜索路径

vim ~/.bashrc
export CPLUS_INCLUDE_PATH=/home/zjw/gdal-3.3.1/build/include
export C_INCLUDE_PATH=/home/zjw/gdal-3.3.1/build/include

gdal设置静态库搜索路径:

export LIBRARY_PATH=$LIBRARY_PATH:/home/zjw/gdal-3.3.1/build/lib

gdal设置运行时动态库的搜索路径:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/zjw/gdal-3.3.1/build/lib

永久更新 source ~/.bashrc才会生效

echo $CPLUS_INCLUDE_PATH
echo $C_INCLUDE_PATH
echo $LIBRARY_PATH
echo $LD_LIBRARY_PATH

除了可以使用C++调用之外,还可以使用go,关于go配置请 参阅

至此 gdal 源码编译结束,后面是巩固和复习对 linux 环境变量,include搜索路径,lib库搜索路径的理解

7 环境变量,include搜索路径,lib库搜索路径

库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用:

  1. 在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。
vim ~/.bashrc
添加
export LD_LIBRARY_PATH=/home/zjw/sqlite-autoconf-3360000/build/lib:$LD_LIBRARY_PATH
保存
source ~/.bashrc
echo $LD_LIBRARY_PATH
  1. 在 /etc/ld.so.conf 文件中添加库的搜索路径。
 sudo vim /etc/ld.so.conf
 添加路径
 /home/zjw/sqlite-autoconf-3360000/build/lib
 保存,此命令激活 /etc/ld.so.cache 文件的更新
 /sbin/ldconfig

将自己可能存放库文件的路径都加入到 /etc/ld.so.conf 中是明智的选择。
添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:

/usr/X11R6/lib
/usr/local/lib
/opt/lib

需要注意的是:第二种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ld.so.cache 从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf 中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/ld.so.cache 文件之后才可以。ldconfig ,简单的说,它的作用就是将 /etc/ld.so.conf 列出的路径下的库文件缓存到/etc/ld.so.cache以供使用。因此当安装完一些库文件(例如刚安装好 glib 或者修改 ld.so.conf 增加新的库路径)后,需要运行一下 /sbin/ldconfig 使所有的库文件都被缓存到 ld.so.cache 中,如果没做,即使库文件明明就在 /usr/lib 下的,也是不会被使用的,结果编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂 computer 蠢猪一个。 (_)

8 参考

[1] linux中make install指定安装目录
[2] make install 时指定安装路径
[3] 理解 Linux中的pkg-config 工具
[4] 系统环境变量设置
[5] pkg-config的用法
[6] 环境变量,include搜索路径,lib库搜索路径

Original: https://blog.csdn.net/zhoumoon/article/details/119391883
Author: 周健文
Title: gdal-3.3.1 linux(Ubuntu) 编译(附SQLite3 PROJ6编译)

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

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

(0)

大家都在看

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