Сборка GDAL со всеми статическими библиотеками - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу разработать небольшую программу, которая проверяет, какие полигоны из шейп-файла пересекают данный прямоугольник.Эта программа должна использоваться на веб-сайте (с помощью команды PHP exec()).Проблема в том, что мой веб-сервер не может установить GDAL по неизвестным мне причинам.Поэтому я не могу ссылаться на общие библиотеки.Вместо этого я должен ссылаться на статические библиотеки, но они не указаны.

Я скачал исходный код GDAL отсюда (2.3.2 Последняя стабильная версия - сентябрь 2018 г.),и следовал инструкциям по сборке отсюда .Поскольку у меня уже есть 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

Первый /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

но ничего не работает.Чего мне не хватает?

РЕДАКТИРОВАТЬ

Во втором испытании (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

1 Ответ

0 голосов
/ 31 июля 2019

Вы можете использовать программу 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]

Вы должны убедиться, что эта программа находится в вашем пути поиска, или вы можете создать псевдоним - например:

alias gdal-config='/home/rodrigo/Downloads/gdal232/gdal-2.3.2/bin/gdal-config'

Теперь ваша команда компиляции и компоновки становится следующей:

g++ `gdal-config --cflags` geofragc.cpp  `gdal-config --libs` `gdal-config --dep-libs`

Вы должны использовать компилятор g++ для связи с библиотеками, построенными на C ++.

Другой вариант - создать Makefile с этими строками:

CXXFLAGS += ${shell gdal-config --cflags} 
LDLIBS += ${shell gdal-config --libs} 
LDLIBS += ${shell gdal-config --dep-libs} 
geofragc: geofragc.cpp

и просто позвонить make с этим Makefile.

Надеюсь, этоПоможу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...