使用所有库静态构建GDAL

Rod*_*igo 5 c++ gcc static-libraries gdal

我想开发一个小程序,检查来自shapefile的哪些多边形与给定的矩形相交。该程序将在网站中使用(使用PHP的exec()命令)。问题是,由于我未知的原因,我的网络服务器无法安装GDAL。因此,我无法链接到共享库。相反,我必须链接到静态库,但是没有给出。

我已经从此处(2.3.2 Latest Stable Release-2018年9月)下载了GDAL源代码,并从此处遵循了构建说明。因为我已经在GDAL上运行了Debian,并且不想弄乱它,所以我遵循了“在非根目录下安装”的说明,并对“某些注意事项”部分中的最后一项进行了一些调整:

cd /home/rodrigo/Downloads/gdal232/gdal-2.3.2
mkdir build
./configure --prefix=/home/rodrigo/Downloads/gdal232/gdal-2.3.2/build/ --without-ld-shared --disable-shared --enable-static
make
make install
export PATH=/home/rodrigo/Downloads/gdal232/gdal-2.3.2/build/bin:$PATH
export LD_LIBRARY_PATH=/home/rodrigo/Downloads/gdal232/gdal-2.3.2/build/lib:$LD_LIBRARY_PATH
export GDAL_DATA=/home/rodrigo/Downloads/gdal232/gdal-2.3.2/build/share/gdal
/usr/bin/gdalinfo --version
build/bin/gdalinfo --version
Run Code Online (Sandbox Code Playgroud)

第一个/usr/bin/gdalinfo --version给出2.1.2(先前安装的版本)。第二个build/bin/gdalinfo --version给出了2.3.2(刚刚构建的版本)。

到目前为止,我的程序仅使用ogrsf_frmts.h标头,该标头位于/usr/include/gdal//home/rodrigo/Downloads/gdal232/gdal-2.3.2/build/include/目录中,具体取决于构建。没有ogrsf_frmts.a文件,只有一个libgdal.a。这是我应该链接的文件吗?如果是这样,怎么办?到目前为止,我已经尝试过:

gcc geofragc.cpp -l:libgdal.a
gcc geofragc.cpp -Wl,-Bstatic -l:libgdal.a
gcc geofragc.cpp -Wl,-Bstatic -l:/home/rodrigo/Downloads/gdal232/gdal-2.3.2/build/lib/libgdal.a
gcc geofragc.cpp -Wl,-Bstatic -l/home/rodrigo/Downloads/gdal232/gdal-2.3.2/build/lib/libgdal.a
gcc geofragc.cpp /home/rodrigo/Downloads/gdal232/gdal-2.3.2/build/lib/libgdal.a
gcc geofragc.cpp -l/home/rodrigo/Downloads/gdal232/gdal-2.3.2/build/lib/libgdal.a
gcc geofragc.cpp -l:/home/rodrigo/Downloads/gdal232/gdal-2.3.2/build/lib/libgdal.a
Run Code Online (Sandbox Code Playgroud)

但没有任何效果。我想念什么?

编辑

第二次试用(gcc geofragc.cpp -Wl,-Bstatic -l:libgdal.a)出现以下错误:

/usr/bin/ld: cannot find -lgcc_s
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../lib/libgdal.a(gdalclientserver.o): In function `GDALServerSpawnAsync()':
(.text+0x1f5e): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

HEK*_*KTO 5

您可以使用该gdal-config程序获得正确的编译和链接选项。这个程序是 GDAL 库的一部分,它有自己的选项:

hekto@ubuntu:~$ gdal-config --help
Usage: gdal-config [OPTIONS]
Options:
    [--prefix[=DIR]]
    [--libs]
    [--dep-libs]
    [--cflags]
    [--datadir]
    [--version]
    [--ogr-enabled]
    [--gnm-enabled]
    [--formats]
Run Code Online (Sandbox Code Playgroud)

你必须确保这个程序在你的搜索路径上,或者你可以创建一个别名 - 例如:

alias gdal-config='/home/rodrigo/Downloads/gdal232/gdal-2.3.2/bin/gdal-config'
Run Code Online (Sandbox Code Playgroud)

现在您的编译和链接命令变为以下命令:

g++ `gdal-config --cflags` geofragc.cpp  `gdal-config --libs` `gdal-config --dep-libs`
Run Code Online (Sandbox Code Playgroud)

您必须使用g++编译器来链接 C++ 构建的库。

另一种选择是Makefile使用这些行创建一个:

CXXFLAGS += ${shell gdal-config --cflags} 
LDLIBS += ${shell gdal-config --libs} 
LDLIBS += ${shell gdal-config --dep-libs} 
geofragc: geofragc.cpp
Run Code Online (Sandbox Code Playgroud)

make用这个调用Makefile

我希望,它会有所帮助。