Сборка GDAL 1.9.0 с использованием Visual Studio 2010: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
 
(не показаны 43 промежуточные версии 4 участников)
Строка 1: Строка 1:
{{Статья|Черновик}}
{{Статья|Опубликована|gdal19-vs2010}}
{{Аннотация|Сборка GDAL 1.9.0 с зависимостями}}


== Сборка библиотеки GDAL 1.9.0 с использованием Visual Studio 2010 ==  
== Введение ==  
В мире все развивается и это касается так же программного обеспечения, а именно выходят новые версии библиотек и новые версии программ для разработки. Поэтому в данной статье речь пойдет о сборке библиотеки GDAL 1.9.0 на Visual Studio 2010.  
В данной статье пойдет речь о сборке библиотеки GDAL 1.9.0 на Visual Studio 2010.  


===== Оглавление =====
[http://gdal.org/ GDAL] - это библиотека для работы с растровыми форматами географических данных. GDAL распространяется [http://www.osgeo.org/ Open Source Geospatial Foundation] на условиях лицензии [http://trac.osgeo.org/gdal/wiki/FAQGeneral#WhatlicensedoesGDALOGRuse X/MIT] , то есть является проектом [http://www.opensource.org/ с открытым исходным кодом]. Как библиотека GDAL предоставляет вызывающему приложению [http://gdal.org/gdal_datamodel_ru.html единую обобщённую модель данных] для всех поддерживаемых форматов файлов данных. Помимо этого в состав GDAL входит [http://gdal.org/gdal_utilities.html набор вспомогательных программ], вызываемых из командной строки, для преобразования и обработки данных.<ref name="gdal">[http://gdal.org/index_ru.html GDAL - Geospatial Data Abstraction Library]</ref>


# Краткая информация о структуре библиотеки GDAL
Для сборки GDAL и библиотек от которых она зависит будет использоваться система сборки [http://www.cmake.org/ CMake]. CMake (от англ. cross platform make) — это кроссплатформенная система автоматизации сборки программного обеспечения из исходного кода. CMake не занимается непосредственно сборкой, a лишь генерирует файлы управления сборкой из файлов CMakeLists.txt<ref name="cmake">[http://ru.wikipedia.org/wiki/CMake CMake], Материал из Википедии — свободной энциклопедии</ref>:
# Второй раздел
*Makefile в системах Unix для сборки с помощью make;
*файлы projects/workspaces в Windows для сборки с помощью Visual C++;
*проекты XCode в Mac OS X


===== 1. Краткая информация о структуре библиотеки GDAL =====
В настоящий момент не существует официального скрипта для сборки GDAL при помощи Cmake. Поэтому, данный метод следует рассматривать в качестве примера сборки и одного из вариантов (унифицированный способ сборки посредством CMake).
Библиотека GDAL состоит из 3-х частей:
Кроме того, сборка представляет собой минимальный набор поддерживаемых растровых и векторных драйверов.
CPL
OGR
GDA


CPL - это базовые функции работы с файловой системой, строками, xml и т.п.<br />
== Структура библиотеки GDAL ==
OGR это работа с геопространственными векторными форматами. Список поддерживаемых форматов можно посмотреть здесь: http://www.gdal.org/ogr/ogr_formats.html<br />
Библиотека GDAL состоит из 3-х основных частей:
GDAL - это работа с растровыми форматами. Список здесь: http://www.gdal.org/formats_list.html <br />
#CPL - базовые функции работы с файловой системой, строками, xml и т.п.<br />
#OGR - работа с векторными форматами. Список форматов размещен здесь: http://www.gdal.org/ogr/ogr_formats.html<br />
#GDAL - работа с растровыми форматами. Список форматов размещен здесь: http://www.gdal.org/formats_list.html <br />


OGR и GDAL обеспечивают не только поддержку форматов, но и операции работы с векторами и растрами. Т.е. GDAL позволяет не только считывать но и манипулировать с геоданными. <br />
OGR и GDAL обеспечивают не только поддержку форматов, но и операции работы с векторами и растрами. Т.е. GDAL позволяет не только считывать но и манипулировать с геоданными. <br />


Теперь про зависимости. Компонент CPL (исходники лежат в подпапке port) зависит от библиотек: zlib, curl. <br />
'''Про зависимости.''' Компонент CPL (исходники лежат в подпапке port) зависит от библиотек: zlib, curl. <br />
OGR зависит от многих библиотек, но базовый набор от expat, geos и proj. <br />
OGR зависит от многих библиотек, но базовый набор от expat, geos и proj. <br />
GDAL зависит от tiff,jpeg, png. <br />
GDAL зависит от tiff, jpeg, png. <br />


Тут надо понимать что такое драйвер. Это отдельный плагин обеспечивающий поддержку формата из списка. В таблице  http://www.gdal.org/formats_list.html  можно посмотреть что от чего зависит. Иногда драйвер не зависит ни от чего и компилировать его просто. Иногда нужна еще отдельная библиотека или набор библиотек.<br />
Следует понимать что такое драйвер. Драйвер - это отдельный плагин обеспечивающий поддержку формата из списков, приведенных выше. В этих списках можно посмотреть, что от чего зависит. Иногда драйвер не зависит ни от какой из сторонних библиотек и компилировать его просто. Иногда нужна еще отдельная библиотека или целый набор библиотек.<br />


Коротко о сборке. В зависимости от необходимости можно собрать GDAL именно в той конфигурации, что нужна (с определенным перечнем драйверов).<br />
'''О сборке.''' В зависимости от необходимости можно собрать GDAL именно в той конфигурации, что нужна (с определенным перечнем драйверов). Собирать будем пошагово: вначале все зависимые библиотеки, затем сам GDAL. Для простоты предлагается делать это все с использованием системы сборки CMake. Для большинства библиотек уже имеются скрипты CMake и сборка становится однотипной и простой. Заодно на выходе будут привычные проекты Visual Studio, где можно зайти в свойства и посмотреть, что и как.
Собирать будем пошагово: вначале все зависимые библиотеки, затем сам GDAL. Для простоты предлагаю делать это все с использованием системы сборки CMake. <br />
 
Суть в том что для большинства библиотек разработаны скрипты CMake и сборка становится однотипной и простой. Заодно на выходе будут привычные проекты Visual Studio, где можно залезть в свойсnва и посмотреть, что и как.<br />
Поэтому скачиваем последнюю версию системы сборки CMake по адресу http://www.cmake.org/cmake/resources/software.html (на текущий момент последняя версия http://www.cmake.org/files/v2.8/cmake-2.8.7-win32-x86.exe) и ставим ее.
 
'''Примечание.'''
CMake, как, впрочем, и другие системы сборки, поддерживает два способа сборки: при первом ('''In source''', in tree build) целевая программа собирается в тех же директориях, в которых расположены исходные тексты. В результате в директориях с исходниками остаются промежуточные файлы сборки. Второй вариант - сборка '''out of source''', при которой сборка выполняется в отдельной директории, в которой сохраняются все промежуточные файлы, а директория с иходными текстами остается в том же состоянии, что и до выполнения сборки.<ref name="cmake-gui">[http://symmetrica.net/cmake/CMake-2.htm CMake], Сборка In-source и Out-of-source</ref>
 
В предложенной методике будет применяться сборка Out-of-source.
 
== Сборка зависимых библиотек ==
=== Библиотека expat ===
Первой библиотекой будем компилировать '''expat'''.
 
Скачиваем исходные тексты библиотеки отсюда http://sourceforge.net/projects/expat/files/expat/2.0.1/ (актуальная версия на момент написания находится в файле под названием expat-2.0.1.tar.gz) и распаковываем в папку, где будут храниться все проекты для сборки библиотек. Например, по следующему пути
C:/project/expat-2.0.1/
Обратите внимание, что эта и все последующие папки должны быть разархивированы так, что в конечной папке, в данном случае expat-2.0.1, должны лежать исходные тексты и сопровождающие файлы (см. рис. 1), а не вложенная папка expat-2.0.1 (для данного примера).
 
[[Файл:Рис. 1.JPG|мини|центр|750пкс|Рис. 1. Структура директории]]
 
Далее скачиваем файл CMakeLists.txt ([[Файл:CMakeLists.zip]]) и помещаем в разархивированную папку expat-2.0.1.
 
Запускаем CMake GUI и указываем два пути:
''Where is the source code'' - это путь куда был распакован expat, например ''C:/project/expat-2.0.1'' и
''Where to build the binaries'' – это папка, куда генерируются файлы проекта ''C:/project/expat-2.0.1/build''.
Нажимаем кнопку ''Configure'' и выбираем версию Visual Studio (в нашем случае Visual Studio 2010), если выдаст ошибку, нажимаем еще раз. После нажимаем кнопку Generate.
 
[[Файл:Рис. 2.JPG|мини|центр|750пкс|Рис. 2. Окно интерфейса пользователя Cmake]]
 
В папке ''build'' должен появиться фаил ''libexpat.sln''. Открываем его с помощью Visual Studio, выставляем сверху
Тип сборки ''Release'' вместо ''Debug'' и компилируем проект (нажимаем F7).
 
[[Файл:Рис. 3.JPG|мини|центр|750пкс|Рис. 3. Выбор типа сборки]]
 
После этого в папке ''C:/projects/expat-2.0.1/lib/Release'' (далее все скомпилированные библиотеки будем класть в схожие папки ''lib/Release'') должны появиться следующие файлы
*libexpat.dll
*libexpat.exp
*libexpat.lib
 
Это был скомпилирован так называемая '''shared dll'''. Существует еще '''static dll''' - тогда на выходе получается только ''libexpat.lib''.
 
Потом ''libexpat.dll'' надо будет скопировать в папку с вашей программой. Туда же надо будет скопирвоать все зависимые библиотеки.
 
=== Библиотека zlib ===
 
Следующей библиотекой будет '''zlib'''.
 
Скачиваем ее отсюда http://zlib.net/ (актуальная на момент написания статьи версия http://zlib.net/zlib126.zip). Файл сценария CMake - CmakeLists.txt в архив уже включен. Распакуем по следующему пути: ''C:/project/zlib-1.2.6''.


Первой библиотекой будем компилировать '''expat'''.<br />
''Первое'': скачиваем систему сборки cmake http://www.cmake.org/files/v2.8/cmake-2.8.7-win32-x86.exe и ставим ее.<br />
Второе: берем файл отсюда http://sourceforge.net/projects/expat/files/expat/2.0.1/ под названием expat-2.0.1.tar.gz - это последняя стабильная версия на 20.03.2012 и распаковываем в папку где у нас будут храниться все проекты для сборки библиотек.
Третье: скачиваем фаил CMakeLists.txt и помещаем в разархивированную папку expat-2.0.1.
Далее запускаем CMake и указываем два пути:
Where is the source code - это то, куда вы разархивировали expat, например C:/projects/expat-2.0.1 и
Where to build the binaries – это та папка, куда сгенерируются файлы проекта C:/projects/expat-2.0.1/build .
Нажимаем кнопку Configure и выбираем версию Visual Studio(в нашем случае Visual Studio 2010), если выдаст ошибку, нажимаем еще раз. После нажимаем кнопку Generate. В папке build должен появиться фаил libexpat.sln, открываем его с помощью Visual Studio, выставляем сверху
Тип сборки Release вместо Debug и компилируем проект(нажимаем F7). После этого в папке C:/projects/expat-2.0.1/lib/Release должны появиться следующие файлы
libexpat.dll
libexpat.exp
libexpat.lib
Это мы скомпилировали так называему shared dll. Есть еще Static dll - тогда на выходе только libexpat.lib. Потом libexpat.dll надо будет скопировать в папку с вашей программой. Туда надо будет кидать все зависимые библиотеки.
Далее делаем тоже самое для zlib, качаем ее отсюда http://zlib.net/zlib126.zip CmakeLists.txt в архив уже включена.
При нажатии на кнопку Configure в самом конце cmake напишет следующее сообщение:  
При нажатии на кнопку Configure в самом конце cmake напишет следующее сообщение:  
CMake Error at CMakeLists.txt:65 (message):
CMake Error at CMakeLists.txt:65 (message):
   You must remove C:/projects/zlib-1.2.6/zconf.h from the
   You must remove C:/project/zlib-1.2.6/zconf.h from the
   source tree.  This file is included with zlib but CMake generates this file
   source tree.  This file is included with zlib but CMake generates this file
   for you automatically in the build directory.
   for you automatically in the build directory.
Здесь говорится, что нужно стереть фаил C://projects/zlib-1.2.6/zconf.h т.к. он сгенерил новый. После того как сотрете опять нажимайте Configure, процесс должен закончиться без ошибок, после запускайте Generate. Далее идем в папку build и открываем фаил zlib.sln с помощью Visual Studio, ставим Release,А так же заходим в меню в пункт Построение и выбираем диспетчер конфигураций, после этого снимаем галочки с examles и minizip они нам не понадобятся, если же будут нужны, необходимо в свойствах этих проектов прописать путь к zlib.h. После всего этого компилируем проект и получаем 3 файла в папке C:/projects/zlib-1.2.6/Debug/Release. Перенесем их в папку C:/projects/zlib-1.2.6/lib/Release для унификации, эту папку необходимо создать самим.


Здесь говорится, что нужно стереть файл ''C://project/zlib-1.2.6/zconf.h'' т.к. он сценарий CMake генерирует новый файл. После удаления zconf.h опять нажимаем ''Configure''. Процесс должен закончиться без ошибок. Далее запускаем ''Generate'' и переходим в папку ''build''. Открываем файл ''zlib.sln'' с помощью Visual Studio (далее VS), ставим тип сборки ''Release''. А так же заходим в меню в пункт Построение и выбираем диспетчер конфигураций, после этого '''снимаем галочки''' с ''examles'' и ''minizip'' они нам не понадобятся (см. рис. 4), если же будут нужны, необходимо в свойствах этих проектов прописать путь к ''zlib.h''.
[[Файл:Рис. 4.JPG|мини|центр|750пкс|Рис. 4. Диспетчер конфигураций]]
После всего этого компилируем проект и получаем 3 файла в папке ''C:/project/zlib-1.2.6/Debug/Release''. Перенесем их в папку ''C:/project/zlib-1.2.6/lib/Release'' для унификации (эту папку необходимо создать самим).
=== Библиотека geos ===
Следующей библиотекой будет '''geos'''.
Скачиваем отсюда http://trac.osgeo.org/geos/ (актуальная версия на момент написания статьи находится по адресу http://download.osgeo.org/geos/geos-3.3.2.tar.bz2). Извлекаем в ''C:/project/geos-3.3.2'' . Делаем конфигурацию в CMake, после этого в разделе Ungrouped Entries убираем галочку с BUILD_TESTING (см. рис. 5).
'''Примечание''', чтобы у вас появился раздел Ungrouped Entries, поставьте галки в Grouped и Advanced (см. рис. 5).
[[Файл:Рис. 5.JPG|мини|центр|750пкс|Рис. 5. Настройки GEOS в CMake-GUI]]
Далее нажимаем Generate, открываем в VS файл ''C:/project/geos-3.3.2/build/geos.sln'', выставляем конфигурацию ''Release'' и компилируем. Если у вас возникла ошибка:
Ошибка 1 error C2668: log: неоднозначный вызов перегруженной функции C:/project/geos-3.3.2/src/operation/buffer/BufferOp.cpp 97 1 geos-static
кликните по ней 2 раза мышкой и в открывшемся файле замените строчку
<source lang=cpp>
int bufEnvPrecisionDigits = (int) (std::log(bufEnvMax) / std::log(10) + 1.0);
</source >
на
<source lang=cpp>
int bufEnvPrecisionDigits = (int) (std::log(bufEnvMax) / std::log(10.0) + 1.0);
</source >
и скомпилируйте заново.
Далее, если возникла ошибка
Ошибка 1 error C2039: toupper: не является членом "std" C:/project/geos-3.3.2/tests/unit/capi/GEOSisValidDetailTest.cpp 60 1 geos_unit
кликните по ней 2 раза мышкой и в открывшемся файле сверху припишите #include <ctype.h>, а вместо
<source lang=cpp>
str[i] = std::toupper(str[i]);
</source >
напишите
<source lang=cpp>
str[i] = toupper(str[i]);
</source >
и скомпилируйте еще раз. После того как все закончится успешно скопируйте файлы из папки ''C:/project/geos-3.3.2/build/lib/Release'' в папку ''C:/project/geos-3.3.2/lib/Release''.
=== Библиотека curl ===
Следующей библиотекой будет '''curl'''.
Скачиваем последнюю версию отсюда http://curl.haxx.se/download.html (актуальная версия на момент написания статьи находилась по следующему пути http://curl.haxx.se/download/curl-7.24.0.zip) и распакуем в ''C:/project/curl-7.24.0''.
Запускаем CMake GUI, указываем пути и нажимаем Configure. Далее прописываем в свойствах
*WSOCK32_LIBRARY - WSOCK32.lib
*WS2_32_LIBRARY -  WS2_32.lib
в ZLIB_INCLUDE_DIR прописываем два пути через точку запятую:<br />
''C:/project/zlib-1.2.6;C:/project/zlib-1.2.6/build'' <br />
в ZLIB_LIBRARY прописываем путь до zlib.lib <br />
''C:/project/zlib-1.2.6/lib/Release/zlib.lib'' <br />
И последнее расставляем галочки как на скриншоте (см. рис. 6). <br />
[[Файл:Рис. 6.JPG|мини|центр|750пкс|Рис. 6. Настройки CURL в CMake-GUI]]
После того как все будет сделано, нажимайте ''Configure'', все должно закончиться без ошибок и потом ''Generate''. Далее открываем файл ''CURL.sln'' в папке ''build''. Заходим в свойства проекта (для этого в Обозревателе решений надо выбрать libcurl)(Проект -> Свойства), далее Свойства конфигурации -> Компоновщик -> Ввод, далее в окне справа Дополнительные зависимости, нажимаем Изменить и удаляем: <br />
*WSOCK32_LIBRARY-NOTFOUND<br />
*WS2_32_LIBRARY-NOTFOUND<br />
Нажимаем применить и ОК, далее компилируем проект. После успешной компиляции помещаем файлы из папки ''C:/project/curl-7.24.0/build/lib/Debug'' в папку ''C:/project/curl-7.24.0/lib/Realese'' <br />
=== Библиотека libjpeg ===
'''Далее будем собирать libjpeg'''  - брать здесь http://www.ijg.org/ последнюю версию http://www.ijg.org/files/jpegsr8d.zip .
CMakeLists скачиваем тут [[Файл:CMakeListsjpeg.zip]] и разархивируем, кладем в папку ''C:/project/jpeg-8d''.<br />
Находим файл jmorecfg.h и меняем строку 197 строчку  на:<br />
<source lang=cpp>
//#define EXTERN(type)          extern type
#ifdef _WIN32
#    ifdef libjpeg_EXPORTS
#        define EXTERN(type) extern /*"C"*/ __declspec(dllexport) type
#    else
#        define EXTERN(type) extern /*"C"*/ __declspec(dllimport) type
#    endif
#else
#    define EXTERN(type)                extern type
#endif
</source>
Запускаем CMake и делаем ''configurate'', затем ''Generate''. Идем в папку ''Build'', открываем ''libjpeg.sln'', ставим ''Release'' и компилируем. <br />
=== Библиотека libpng ===
Следующей библиотекой будет '''libpng'''.
Скачиваем последнюю версию отсюда http://www.libpng.org/pub/png/libpng.html (актуальная версия на момент написания статьи находилась по следующему пути http://download.sourceforge.net/libpng/lpng159.zip). Распаковываем и запускаем CMake GUI, проводим конфигурацию. Прописываем пути для ZLIB_INCLUDE_DIR и ZLIB_LIBRARY-NOTFOUND как делали это выше.  Нажимаем Configure и Generate. Далее открываем libpng.sln, ставим конфигурацию Release и компилируем. Файлы из папки ''C:/project/lpng159/build/Release'' переносим в ''C:/project/lpng159/lib/Release''.<br />
=== Библиотека libtiff ===
Следующей библиотекой будет '''libtiff'''.
Скачиваем последнюю версию отсюда ftp://ftp.remotesensing.org/pub/libtiff (актуальная версия на момент написания статьи находилась по следующему пути ftp://ftp.remotesensing.org/pub/libtiff/tiff-4.0.1.zip), распаковываем в ''C:/project/tiff-4.0.1'', качаем CMakeLists и еще пару файлов и распаковываем как обычно [[Файл:Tiff.zip]]. Запускаем CMake, делаем ''Configure'' и прописываем пути для ZLIB_INCLUDE_DIR и ZLIB_LIBRARY-NOTFOUND как делали это выше.  Нажимаем ''Configure'' еще раз и ''Generate'', далее открываем ''libtiff.sln'' ставим конфигурацию ''Release'' и компилируем.<br />
=== Библиотека proj ===
Следующей библиотекой будет '''proj'''.
Скачиваем последнюю версию отсюда http://trac.osgeo.org/proj/ (актуальная версия на момент написания статьи находилась по следующему пути http://download.osgeo.org/proj/proj-4.8.0.zip). Распаковываем, и кидаем туда этот файл [[Файл:CMakeListsproj.zip]], запускаем CMake, прописываем пути до proj, жмем ''Configure'' и ''Generate'', открываем ''proj4.sln'', ставим конфигурацию ''Release'' и компилируем.
'''На этом вся подготовка закончена, у нас есть все необходимые библиотеки.'''<br />
== Сборка GDAL ==
Приступаем к сборке самого '''GDAL'''.
Скачиваем отсюда http://trac.osgeo.org/gdal/wiki/DownloadSource последнюю версию на момент написания статьи gdal 1.9.0 ( http://download.osgeo.org/gdal/gdal190.zip ). Качаем архив [[Файл:Gdal_trank.zip]] . Распаковываем gdal в папку ''project''. В полученную папку ''C:/project/gdal-1.9.0'' распаковываем файлы из архива ''Gdal_trank.zip'' (папку cmake и файл CMakeLists). <br />
Либо скачиваем последнюю версию CMake файлов для GDAL вместе с самим GDAL c GitHub:
<pre>git clone https://github.com/aashish24/gdal-svn.git -b cmake4gdal gdal-cmake-trunk</pre>
И получаем папку gdal-cmake-trunk. <br />
Запускаем CMake и как обычно прописываем 2 пути ''C:/project/gdal-1.9.0 и C:/project/gdal-1.9.0/build'', нажимаем ''Configure''. <br />
Когда выскочит ошибка, прописываем пути до '''zlib''': ''C:/project/zlib-1.2.6;C:/project/zlib-1.2.6/build'' и ''C:/project/zlib-1.2.6/lib/Release/zlib.lib'' в директориях соответственно ZLIB_INCLUDE_DIR и ZLIB_LIBRARY. Далее все пути надо будет прописывать примерно аналогично для директории INCLUDE и LIBRARY. <br />
Нажимаем ''Configure'', получаем ошибку и прописываем пути для '''CURL''' ''C:/project/curl-7.24.0/include'' и ''C:/project/curl-7.24.0/lib/Release/libcurl_imp.lib''.<br />
Нажимаем ''Configure'', получаем ошибку и прописываем пути для '''EXPAT''': ''C:/project/expat-2.0.1/lib/'' и ''C:/project/expat-2.0.1/lib/Release/libexpat.lib''.<br />
Нажимаем ''Configure'', получаем ошибку и прописываем пути для '''GEOS''': ''C:/project/geos-3.3.2/include'' и ''C:/project/geos-3.3.2/lib/Release/geos_c.lib''.<br />
Нажимаем ''Configure'', получаем ошибку и прописываем пути для '''PROJ''': ''C:/project/proj-4.8.0/src'' и ''C:/project/proj-4.8.0/lib/Release/proj4.lib''. <br />
Нажимаем ''Configure'', получаем ошибку, идем в '''OGR''' и убираем галочку с OGR_PG.<br />
Нажимаем ''Configure'', получаем ошибку и прописываем пути для '''JPEG''': ''C:/project/jpeg-8d;C:/project/jpeg-8d/build'' и ''C:/project/jpeg-8d/lib/Release/libjpeg.lib''.<br />
Нажимаем ''Configure'', получаем ошибку и прописываем пути для '''TIFF''': ''C:/project/tiff-4.0.1/libtiff;C:/project/tiff-4.0.1/build'' и ''C:/project/tiff-4.0.1/lib/Release/libtiff.lib''. <br />
Нажимаем ''Configure'', получаем ошибку и прописываем пути для '''PNG''', '''тут внимательно'''! Первая строчка - пути до LIBRARY: ''C:/project/lpng159/lib/Release/libpng15.lib'', вторая ''C:/project/lpng159;C:/project/lpng159/build''.<br />
Нажимаем ''Configure'', все должно закончиться успешно, нажимаем ''Generate''. Далее идем в папку ''C:/project/gdal-1.9.0/build'' и открываем файл ''gdallib.sln'' с помощью VS. Ставим конфигурацию ''Release'' и компилируем. Если все прошло без ошибок, '''вы собрали GDAL!'''<br />
Теперь необходимо проверить работоспособность собранной библиотеки.


== Тестовый пример ==


Сделаем тестовый пример. Исходный код берем отсюда: http://www.gdal.org/gdal_tutorial_ru.html.<br />
Создадим консольный проект C++ CLR. Пропишем следующие пути:<br />
выбираем в меню Проект->Свойства...->Свойства конфигурации->Компоновщик->Ввод. На этой странице в дополнительных зависимостях прописываем ''C:/project/gdal-1.9.0/build/Release/gdal19.lib''<br />
теперь в Проект->Свойства...->Свойства конфигурации->C/C++ в Дополнительные зависимости включаемых файлов прописать<br />
*''C:/project/gdal-1.9.0/build/port/''<br />
*''C:/project/gdal-1.9.0/alg/''<br />
*''C:/project/gdal-1.9.0/''<br />
*''C:/project/gdal-1.9.0/''gcore<br />
*''C:/project/gdal-1.9.0/''port<br />


Так же необходимо в папку, где содержатся откомпилированные файлы проекта (обычно папка с именем конфигурации ''Release'' или ''Debug'') положить сформированные dll, собрынные нами ранее:<br />
*gdal19.dll
*geos.dll
*geos_c.dll
*libcurl.dll
*libexpat.dll
*libjpeg.dll
*libpng15.dll
*libtiff.dll
*proj4.dll
*zlib1.dll


Так же в эту папку положите какой-нибудь рисунок и задайте путь до него в тексте программы. Например, ''1.JPG''.


Так выглядит тестовый код:


<source lang=cpp>
#include "stdafx.h"
#include "gdal_priv.h"
using namespace System;
int main(array<System::String ^> ^args)
{
    GDALDataset  *poDataset;
    GDALAllRegister();
    poDataset = (GDALDataset *) GDALOpen( "1.JPG", GA_ReadOnly ); // здесь надо указать путь до изображения
if( poDataset == NULL )
    {
      return 0;
    }
double        adfGeoTransform[6];
    printf( "Драйвер: %s/%s\n",
            poDataset->GetDriver()->GetDescription(),
            poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) );
    printf( "Размер %dx%dx%d\n",
            poDataset->GetRasterXSize(), poDataset->GetRasterYSize(),
            poDataset->GetRasterCount() );
    if( poDataset->GetProjectionRef()  != NULL )
        printf( "Проекция \"%s\"\n", poDataset->GetProjectionRef() );
    if( poDataset->GetGeoTransform( adfGeoTransform ) == CE_None )
    {
        printf( "Начало координат (%.6f,%.6f)\n",
                adfGeoTransform[0], adfGeoTransform[3] );
        printf( "Размер пиксела (%.6f,%.6f)\n",
                adfGeoTransform[1], adfGeoTransform[5] );
    }
    return 0;
}
</source>


== Заключение ==
В статье мы научились собирать библиотеку '''GDAL''' и библиотеки от которых она зависит, а также сделали тестовый пример для работы с ней.
Комментарии, исправления, отзывы и пожелания '''приветствуются'''.


<references />


Текст статьи
'''Огромное СПАСИБО за помощь со сборкой и терпение пользователю ГИС-ЛАБ Bishop.''' <br />
Пример кода программы/html и т.п.
2. Второй раздел
Текст статьи
Еще один пример текста программы
  с сохранением переносов
Таблица
Заголовок Заголовок Заголовок
текст текст текст
Ссылки по теме
• Ссылка на дополнительный источник информации внутренняя
• Ссылка на дополнительный источник информации внешняя
Дата создания: 04.07.2010
Автор(ы): Максим Дубинин

Текущая версия от 08:18, 22 августа 2013

Эта страница опубликована в основном списке статей сайта
по адресу http://gis-lab.info/qa/gdal19-vs2010.html


Сборка GDAL 1.9.0 с зависимостями

Введение

В данной статье пойдет речь о сборке библиотеки GDAL 1.9.0 на Visual Studio 2010.

GDAL - это библиотека для работы с растровыми форматами географических данных. GDAL распространяется Open Source Geospatial Foundation на условиях лицензии X/MIT , то есть является проектом с открытым исходным кодом. Как библиотека GDAL предоставляет вызывающему приложению единую обобщённую модель данных для всех поддерживаемых форматов файлов данных. Помимо этого в состав GDAL входит набор вспомогательных программ, вызываемых из командной строки, для преобразования и обработки данных.[1]

Для сборки GDAL и библиотек от которых она зависит будет использоваться система сборки CMake. CMake (от англ. cross platform make) — это кроссплатформенная система автоматизации сборки программного обеспечения из исходного кода. CMake не занимается непосредственно сборкой, a лишь генерирует файлы управления сборкой из файлов CMakeLists.txt[2]:

  • Makefile в системах Unix для сборки с помощью make;
  • файлы projects/workspaces в Windows для сборки с помощью Visual C++;
  • проекты XCode в Mac OS X

В настоящий момент не существует официального скрипта для сборки GDAL при помощи Cmake. Поэтому, данный метод следует рассматривать в качестве примера сборки и одного из вариантов (унифицированный способ сборки посредством CMake). Кроме того, сборка представляет собой минимальный набор поддерживаемых растровых и векторных драйверов.

Структура библиотеки GDAL

Библиотека GDAL состоит из 3-х основных частей:

  1. CPL - базовые функции работы с файловой системой, строками, xml и т.п.
  2. OGR - работа с векторными форматами. Список форматов размещен здесь: http://www.gdal.org/ogr/ogr_formats.html
  3. GDAL - работа с растровыми форматами. Список форматов размещен здесь: http://www.gdal.org/formats_list.html

OGR и GDAL обеспечивают не только поддержку форматов, но и операции работы с векторами и растрами. Т.е. GDAL позволяет не только считывать но и манипулировать с геоданными.

Про зависимости. Компонент CPL (исходники лежат в подпапке port) зависит от библиотек: zlib, curl.
OGR зависит от многих библиотек, но базовый набор от expat, geos и proj.
GDAL зависит от tiff, jpeg, png.

Следует понимать что такое драйвер. Драйвер - это отдельный плагин обеспечивающий поддержку формата из списков, приведенных выше. В этих списках можно посмотреть, что от чего зависит. Иногда драйвер не зависит ни от какой из сторонних библиотек и компилировать его просто. Иногда нужна еще отдельная библиотека или целый набор библиотек.

О сборке. В зависимости от необходимости можно собрать GDAL именно в той конфигурации, что нужна (с определенным перечнем драйверов). Собирать будем пошагово: вначале все зависимые библиотеки, затем сам GDAL. Для простоты предлагается делать это все с использованием системы сборки CMake. Для большинства библиотек уже имеются скрипты CMake и сборка становится однотипной и простой. Заодно на выходе будут привычные проекты Visual Studio, где можно зайти в свойства и посмотреть, что и как.

Поэтому скачиваем последнюю версию системы сборки CMake по адресу http://www.cmake.org/cmake/resources/software.html (на текущий момент последняя версия http://www.cmake.org/files/v2.8/cmake-2.8.7-win32-x86.exe) и ставим ее.

Примечание. CMake, как, впрочем, и другие системы сборки, поддерживает два способа сборки: при первом (In source, in tree build) целевая программа собирается в тех же директориях, в которых расположены исходные тексты. В результате в директориях с исходниками остаются промежуточные файлы сборки. Второй вариант - сборка out of source, при которой сборка выполняется в отдельной директории, в которой сохраняются все промежуточные файлы, а директория с иходными текстами остается в том же состоянии, что и до выполнения сборки.[3]

В предложенной методике будет применяться сборка Out-of-source.

Сборка зависимых библиотек

Библиотека expat

Первой библиотекой будем компилировать expat.

Скачиваем исходные тексты библиотеки отсюда http://sourceforge.net/projects/expat/files/expat/2.0.1/ (актуальная версия на момент написания находится в файле под названием expat-2.0.1.tar.gz) и распаковываем в папку, где будут храниться все проекты для сборки библиотек. Например, по следующему пути

C:/project/expat-2.0.1/

Обратите внимание, что эта и все последующие папки должны быть разархивированы так, что в конечной папке, в данном случае expat-2.0.1, должны лежать исходные тексты и сопровождающие файлы (см. рис. 1), а не вложенная папка expat-2.0.1 (для данного примера).

Рис. 1. Структура директории

Далее скачиваем файл CMakeLists.txt (Файл:CMakeLists.zip) и помещаем в разархивированную папку expat-2.0.1.

Запускаем CMake GUI и указываем два пути: Where is the source code - это путь куда был распакован expat, например C:/project/expat-2.0.1 и Where to build the binaries – это папка, куда генерируются файлы проекта C:/project/expat-2.0.1/build. Нажимаем кнопку Configure и выбираем версию Visual Studio (в нашем случае Visual Studio 2010), если выдаст ошибку, нажимаем еще раз. После нажимаем кнопку Generate.

Рис. 2. Окно интерфейса пользователя Cmake

В папке build должен появиться фаил libexpat.sln. Открываем его с помощью Visual Studio, выставляем сверху Тип сборки Release вместо Debug и компилируем проект (нажимаем F7).

Рис. 3. Выбор типа сборки

После этого в папке C:/projects/expat-2.0.1/lib/Release (далее все скомпилированные библиотеки будем класть в схожие папки lib/Release) должны появиться следующие файлы

  • libexpat.dll
  • libexpat.exp
  • libexpat.lib

Это был скомпилирован так называемая shared dll. Существует еще static dll - тогда на выходе получается только libexpat.lib.

Потом libexpat.dll надо будет скопировать в папку с вашей программой. Туда же надо будет скопирвоать все зависимые библиотеки.

Библиотека zlib

Следующей библиотекой будет zlib.

Скачиваем ее отсюда http://zlib.net/ (актуальная на момент написания статьи версия http://zlib.net/zlib126.zip). Файл сценария CMake - CmakeLists.txt в архив уже включен. Распакуем по следующему пути: C:/project/zlib-1.2.6.

При нажатии на кнопку Configure в самом конце cmake напишет следующее сообщение:

CMake Error at CMakeLists.txt:65 (message):
 You must remove C:/project/zlib-1.2.6/zconf.h from the
 source tree.  This file is included with zlib but CMake generates this file
 for you automatically in the build directory.

Здесь говорится, что нужно стереть файл C://project/zlib-1.2.6/zconf.h т.к. он сценарий CMake генерирует новый файл. После удаления zconf.h опять нажимаем Configure. Процесс должен закончиться без ошибок. Далее запускаем Generate и переходим в папку build. Открываем файл zlib.sln с помощью Visual Studio (далее VS), ставим тип сборки Release. А так же заходим в меню в пункт Построение и выбираем диспетчер конфигураций, после этого снимаем галочки с examles и minizip они нам не понадобятся (см. рис. 4), если же будут нужны, необходимо в свойствах этих проектов прописать путь к zlib.h.

Рис. 4. Диспетчер конфигураций

После всего этого компилируем проект и получаем 3 файла в папке C:/project/zlib-1.2.6/Debug/Release. Перенесем их в папку C:/project/zlib-1.2.6/lib/Release для унификации (эту папку необходимо создать самим).

Библиотека geos

Следующей библиотекой будет geos.

Скачиваем отсюда http://trac.osgeo.org/geos/ (актуальная версия на момент написания статьи находится по адресу http://download.osgeo.org/geos/geos-3.3.2.tar.bz2). Извлекаем в C:/project/geos-3.3.2 . Делаем конфигурацию в CMake, после этого в разделе Ungrouped Entries убираем галочку с BUILD_TESTING (см. рис. 5).

Примечание, чтобы у вас появился раздел Ungrouped Entries, поставьте галки в Grouped и Advanced (см. рис. 5).

Рис. 5. Настройки GEOS в CMake-GUI

Далее нажимаем Generate, открываем в VS файл C:/project/geos-3.3.2/build/geos.sln, выставляем конфигурацию Release и компилируем. Если у вас возникла ошибка:

Ошибка 1 error C2668: log: неоднозначный вызов перегруженной функции C:/project/geos-3.3.2/src/operation/buffer/BufferOp.cpp	97 1 geos-static

кликните по ней 2 раза мышкой и в открывшемся файле замените строчку

int bufEnvPrecisionDigits = (int) (std::log(bufEnvMax) / std::log(10) + 1.0);

на

int bufEnvPrecisionDigits = (int) (std::log(bufEnvMax) / std::log(10.0) + 1.0);

и скомпилируйте заново.

Далее, если возникла ошибка

Ошибка 1 error C2039: toupper: не является членом "std"	C:/project/geos-3.3.2/tests/unit/capi/GEOSisValidDetailTest.cpp	60 1 geos_unit

кликните по ней 2 раза мышкой и в открывшемся файле сверху припишите #include <ctype.h>, а вместо

str[i] = std::toupper(str[i]);

напишите

str[i] = toupper(str[i]);

и скомпилируйте еще раз. После того как все закончится успешно скопируйте файлы из папки C:/project/geos-3.3.2/build/lib/Release в папку C:/project/geos-3.3.2/lib/Release.

Библиотека curl

Следующей библиотекой будет curl. Скачиваем последнюю версию отсюда http://curl.haxx.se/download.html (актуальная версия на момент написания статьи находилась по следующему пути http://curl.haxx.se/download/curl-7.24.0.zip) и распакуем в C:/project/curl-7.24.0.

Запускаем CMake GUI, указываем пути и нажимаем Configure. Далее прописываем в свойствах

  • WSOCK32_LIBRARY - WSOCK32.lib
  • WS2_32_LIBRARY - WS2_32.lib

в ZLIB_INCLUDE_DIR прописываем два пути через точку запятую:
C:/project/zlib-1.2.6;C:/project/zlib-1.2.6/build
в ZLIB_LIBRARY прописываем путь до zlib.lib
C:/project/zlib-1.2.6/lib/Release/zlib.lib
И последнее расставляем галочки как на скриншоте (см. рис. 6).

Рис. 6. Настройки CURL в CMake-GUI

После того как все будет сделано, нажимайте Configure, все должно закончиться без ошибок и потом Generate. Далее открываем файл CURL.sln в папке build. Заходим в свойства проекта (для этого в Обозревателе решений надо выбрать libcurl)(Проект -> Свойства), далее Свойства конфигурации -> Компоновщик -> Ввод, далее в окне справа Дополнительные зависимости, нажимаем Изменить и удаляем:

  • WSOCK32_LIBRARY-NOTFOUND
  • WS2_32_LIBRARY-NOTFOUND

Нажимаем применить и ОК, далее компилируем проект. После успешной компиляции помещаем файлы из папки C:/project/curl-7.24.0/build/lib/Debug в папку C:/project/curl-7.24.0/lib/Realese

Библиотека libjpeg

Далее будем собирать libjpeg - брать здесь http://www.ijg.org/ последнюю версию http://www.ijg.org/files/jpegsr8d.zip . CMakeLists скачиваем тут Файл:CMakeListsjpeg.zip и разархивируем, кладем в папку C:/project/jpeg-8d.
Находим файл jmorecfg.h и меняем строку 197 строчку на:

//#define EXTERN(type)          extern type
#ifdef _WIN32
#    ifdef libjpeg_EXPORTS
#        define EXTERN(type) extern /*"C"*/ __declspec(dllexport) type
#    else
#        define EXTERN(type) extern /*"C"*/ __declspec(dllimport) type
#    endif
#else
#    define EXTERN(type)                extern type
#endif

Запускаем CMake и делаем configurate, затем Generate. Идем в папку Build, открываем libjpeg.sln, ставим Release и компилируем.

Библиотека libpng

Следующей библиотекой будет libpng. Скачиваем последнюю версию отсюда http://www.libpng.org/pub/png/libpng.html (актуальная версия на момент написания статьи находилась по следующему пути http://download.sourceforge.net/libpng/lpng159.zip). Распаковываем и запускаем CMake GUI, проводим конфигурацию. Прописываем пути для ZLIB_INCLUDE_DIR и ZLIB_LIBRARY-NOTFOUND как делали это выше. Нажимаем Configure и Generate. Далее открываем libpng.sln, ставим конфигурацию Release и компилируем. Файлы из папки C:/project/lpng159/build/Release переносим в C:/project/lpng159/lib/Release.

Библиотека libtiff

Следующей библиотекой будет libtiff. Скачиваем последнюю версию отсюда ftp://ftp.remotesensing.org/pub/libtiff (актуальная версия на момент написания статьи находилась по следующему пути ftp://ftp.remotesensing.org/pub/libtiff/tiff-4.0.1.zip), распаковываем в C:/project/tiff-4.0.1, качаем CMakeLists и еще пару файлов и распаковываем как обычно Файл:Tiff.zip. Запускаем CMake, делаем Configure и прописываем пути для ZLIB_INCLUDE_DIR и ZLIB_LIBRARY-NOTFOUND как делали это выше. Нажимаем Configure еще раз и Generate, далее открываем libtiff.sln ставим конфигурацию Release и компилируем.

Библиотека proj

Следующей библиотекой будет proj. Скачиваем последнюю версию отсюда http://trac.osgeo.org/proj/ (актуальная версия на момент написания статьи находилась по следующему пути http://download.osgeo.org/proj/proj-4.8.0.zip). Распаковываем, и кидаем туда этот файл Файл:CMakeListsproj.zip, запускаем CMake, прописываем пути до proj, жмем Configure и Generate, открываем proj4.sln, ставим конфигурацию Release и компилируем.

На этом вся подготовка закончена, у нас есть все необходимые библиотеки.

Сборка GDAL

Приступаем к сборке самого GDAL.

Скачиваем отсюда http://trac.osgeo.org/gdal/wiki/DownloadSource последнюю версию на момент написания статьи gdal 1.9.0 ( http://download.osgeo.org/gdal/gdal190.zip ). Качаем архив Файл:Gdal trank.zip . Распаковываем gdal в папку project. В полученную папку C:/project/gdal-1.9.0 распаковываем файлы из архива Gdal_trank.zip (папку cmake и файл CMakeLists).

Либо скачиваем последнюю версию CMake файлов для GDAL вместе с самим GDAL c GitHub:

git clone https://github.com/aashish24/gdal-svn.git -b cmake4gdal gdal-cmake-trunk

И получаем папку gdal-cmake-trunk.

Запускаем CMake и как обычно прописываем 2 пути C:/project/gdal-1.9.0 и C:/project/gdal-1.9.0/build, нажимаем Configure.
Когда выскочит ошибка, прописываем пути до zlib: C:/project/zlib-1.2.6;C:/project/zlib-1.2.6/build и C:/project/zlib-1.2.6/lib/Release/zlib.lib в директориях соответственно ZLIB_INCLUDE_DIR и ZLIB_LIBRARY. Далее все пути надо будет прописывать примерно аналогично для директории INCLUDE и LIBRARY.
Нажимаем Configure, получаем ошибку и прописываем пути для CURL C:/project/curl-7.24.0/include и C:/project/curl-7.24.0/lib/Release/libcurl_imp.lib.
Нажимаем Configure, получаем ошибку и прописываем пути для EXPAT: C:/project/expat-2.0.1/lib/ и C:/project/expat-2.0.1/lib/Release/libexpat.lib.
Нажимаем Configure, получаем ошибку и прописываем пути для GEOS: C:/project/geos-3.3.2/include и C:/project/geos-3.3.2/lib/Release/geos_c.lib.
Нажимаем Configure, получаем ошибку и прописываем пути для PROJ: C:/project/proj-4.8.0/src и C:/project/proj-4.8.0/lib/Release/proj4.lib.
Нажимаем Configure, получаем ошибку, идем в OGR и убираем галочку с OGR_PG.
Нажимаем Configure, получаем ошибку и прописываем пути для JPEG: C:/project/jpeg-8d;C:/project/jpeg-8d/build и C:/project/jpeg-8d/lib/Release/libjpeg.lib.
Нажимаем Configure, получаем ошибку и прописываем пути для TIFF: C:/project/tiff-4.0.1/libtiff;C:/project/tiff-4.0.1/build и C:/project/tiff-4.0.1/lib/Release/libtiff.lib.
Нажимаем Configure, получаем ошибку и прописываем пути для PNG, тут внимательно! Первая строчка - пути до LIBRARY: C:/project/lpng159/lib/Release/libpng15.lib, вторая C:/project/lpng159;C:/project/lpng159/build.
Нажимаем Configure, все должно закончиться успешно, нажимаем Generate. Далее идем в папку C:/project/gdal-1.9.0/build и открываем файл gdallib.sln с помощью VS. Ставим конфигурацию Release и компилируем. Если все прошло без ошибок, вы собрали GDAL!

Теперь необходимо проверить работоспособность собранной библиотеки.

Тестовый пример

Сделаем тестовый пример. Исходный код берем отсюда: http://www.gdal.org/gdal_tutorial_ru.html.
Создадим консольный проект C++ CLR. Пропишем следующие пути:
выбираем в меню Проект->Свойства...->Свойства конфигурации->Компоновщик->Ввод. На этой странице в дополнительных зависимостях прописываем C:/project/gdal-1.9.0/build/Release/gdal19.lib
теперь в Проект->Свойства...->Свойства конфигурации->C/C++ в Дополнительные зависимости включаемых файлов прописать

  • C:/project/gdal-1.9.0/build/port/
  • C:/project/gdal-1.9.0/alg/
  • C:/project/gdal-1.9.0/
  • C:/project/gdal-1.9.0/gcore
  • C:/project/gdal-1.9.0/port

Так же необходимо в папку, где содержатся откомпилированные файлы проекта (обычно папка с именем конфигурации Release или Debug) положить сформированные dll, собрынные нами ранее:

  • gdal19.dll
  • geos.dll
  • geos_c.dll
  • libcurl.dll
  • libexpat.dll
  • libjpeg.dll
  • libpng15.dll
  • libtiff.dll
  • proj4.dll
  • zlib1.dll

Так же в эту папку положите какой-нибудь рисунок и задайте путь до него в тексте программы. Например, 1.JPG.

Так выглядит тестовый код:

#include "stdafx.h"
#include "gdal_priv.h"
using namespace System;
int main(array<System::String ^> ^args)
{
    GDALDataset  *poDataset;
    GDALAllRegister();
    poDataset = (GDALDataset *) GDALOpen( "1.JPG", GA_ReadOnly ); // здесь надо указать путь до изображения
	 if( poDataset == NULL )
    {
       return 0;
    }
	double        adfGeoTransform[6];
    printf( "Драйвер: %s/%s\n",
            poDataset->GetDriver()->GetDescription(), 
            poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) );
    printf( "Размер %dx%dx%d\n", 
            poDataset->GetRasterXSize(), poDataset->GetRasterYSize(),
            poDataset->GetRasterCount() );
    if( poDataset->GetProjectionRef()  != NULL )
        printf( "Проекция \"%s\"\n", poDataset->GetProjectionRef() );
    if( poDataset->GetGeoTransform( adfGeoTransform ) == CE_None )
    {
        printf( "Начало координат (%.6f,%.6f)\n",
                adfGeoTransform[0], adfGeoTransform[3] );
        printf( "Размер пиксела (%.6f,%.6f)\n",
                adfGeoTransform[1], adfGeoTransform[5] );
    }
    return 0;
}

Заключение

В статье мы научились собирать библиотеку GDAL и библиотеки от которых она зависит, а также сделали тестовый пример для работы с ней. Комментарии, исправления, отзывы и пожелания приветствуются.

  1. GDAL - Geospatial Data Abstraction Library
  2. CMake, Материал из Википедии — свободной энциклопедии
  3. CMake, Сборка In-source и Out-of-source

Огромное СПАСИБО за помощь со сборкой и терпение пользователю ГИС-ЛАБ Bishop.