GDALをVisual Studioで使えるようにする方法


GDAL(Geospatial Data Abstraction Library)という地理空間情報ライブラリをVisual Studio (Visual C++)で使えるようにする方法をまとめました。  
動作確認をした環境は以下です。
1. **Windows7 Pro 64bit + Visual Studio 2013 + GDAL 2.1.3**
2. Windows10 Pro 64bit + Visual Studio 2015 + GDAL 2.1.3

本ページでは、**Windows7 Pro 64bit + Visual Studio 2013 + GDAL 2.1.3**を想定しています。

## リンク
1. GDAL http://www.gdal.org/
2. GDALソースコード http://download.osgeo.org/gdal/
3. GDAL API Tutorial http://www.gdal.org/gdal_tutorial.html

## ソースコードのビルド
まず、リンクの2.から適当なバージョンのソースコードをダウンロードしてきてZIPファイルを展開します。このページでは仮に**C:\gdal213**に展開したものとします。

次に**C:\gdal213\nmake.opt**をテキストエディタで開き**OPTFLAGS=**の右辺の/MDを**/MDd**に書き換えます。ただし全てではなく、条件"!IFNDEF DEBUG"に入る箇所はそのままにします。

```text:nmake.opt(127行目あたりから)
!IFNDEF OPTFLAGS
!IF $  (MSVC_VER) >= 1400
!IFNDEF DEBUG    #ここの/MDは書きかえない
OPTFLAGS= $  (CXX_ANALYZE_FLAGS) $(CXX_PDB_FLAGS) /nologo /MD /EHsc /Ox /FC /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE /DNDEBUG
!ELSE    #ここの/MDは/MDdに書きかえる
OPTFLAGS= $  (CXX_ANALYZE_FLAGS) $(CXX_PDB_FLAGS) /nologo /MDd /EHsc /FC /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE /DDEBUG
!ENDIF
!ELSE
!IFNDEF DEBUG    #ここの/MDは書きかえない
OPTFLAGS= $  (CXX_PDB_FLAGS) /nologo /MD /EHsc /GR /Ox /FC /DNDEBUG
!ELSE    #ここの/MDは/MDdに書きかえる
OPTFLAGS= $  (CXX_PDB_FLAGS) /nologo /MDd /EHsc /GR /FC /DDEBUG
!ENDIF
!ENDIF  #MSVC_VER
!ENDIF  # OPTFLAGS
```

VisualStudioのコマンドプロンプトを立ち上げ、以下コマンドを実行します。ビルドの環境によってコマンドプロンプトが異なりますので注意してください。  

| ビルド環境 | コマンドプロンプト | コマンド |
|:--|:--|:--|
|32bit Debug   | VS2013 x86 Native Tools コマンド プロンプト | \$ nmake /f makefile.vc clean <br> \$ nmake /f makefile.vc MSVC_VER=1800 DEBUG=1 WITH_PDB=1|
|32bit Release | VS2013 x86 Native Tools コマンド プロンプト | \$ nmake /f makefile.vc clean <br> \$ nmake /f makefile.vc MSVC_VER=1800|
|64bit Debug   | VS2013 x64 Native Tools コマンド プロンプト | \$ nmake /f makefile.vc clean <br> \$ nmake /f makefile.vc MSVC_VER=1800 DEBUG=1 WIN64=YES WITH_PDB=1|
|64bit Release | VS2013 x64 Native Tools コマンド プロンプト | \$ nmake /f makefile.vc clean <br> \$ nmake /f makefile.vc MSVC_VER=1800 WIN64=YES|

**MSVC_VER=1800**の部分はVisualStudioのバージョンによって変える必要があります。nmake.optに書いてある以下の表を参考にしてください。

```text:nmake.opt(30行目あたりから)
###############################################################################
# Check version of Visual C++ compiler:
# nmake -f makefile.vc MSVC_VER=xxxx
# where xxxx is one of following:
# 1900 = 14.0(2015)
# 1800 = 12.0(2013)
# 1700 = 11.0(2012)
# 1600 = 10.0(2010)
# 1500 = 9.0 (2008)
# 1400 = 8.0 (2005) - specific compilation flags, different from older VC++
# 1310 = 7.1 (2003) # is it still supported ?
# 1300 = 7.0 (2002) # is it still supported ?
```

下記のエラーメッセージが出て処理が止まった場合
>ogrsxflayer.cpp(733) : error C2181: else文がifと一致しません

**C:\gdal213\ogr\ogrsf_frmts\sxf\ogrsxflayer.cpp**をテキストエディタで開き、733行目にあるif文の右のコメントを削除してください。あるいはif文に中括弧{}を追加してもかまいません。終わったら保存して閉じてコマンドを再度実行します。
<br>*[2017-09-17追記]Ver2.2.1ではエラーなく完了するようです。*

処理がエラーなく終了したらC:\gdal213内に**gdal.lib**と**gdal_i.lib**が作られていることを確認します。
<br>*[2017-11-11追記]nmake.opt内を読むと両方作成されるはずはないのですが、なぜかVer2.1.3では両方作成されます。Ver.2.2.1では特に指定しなければgda_i.libのみが作成されます。*

## Visual Studioの設定
VisualC++の空のプロジェクトを作り、ソリューションエクスプローラからソリューションを右クリックしてプロパティを開きます。

- **C/C++＞全般＞追加のインクルードディレクトリ**に以下を追加

```text
C:\gdal213\alg
C:\gdal213\gcore
C:\gdal213\ogr
C:\gdal213\port
```

- **C/C++＞プリプロセッサ＞プリプロセッサの定義**に以下を追加

```text
_CRT_SECURE_NO_DEPRECATE
```

- **リンカー＞全般＞追加のライブラリディレクトリ**に以下を追加

```text
C:\gdal213
```

- **リンカー＞入力＞追加の依存ファイル**に以下を追加<br>※"legacy_stdio_definitions.lib"はVS2013では不要

```text
gdal_i.lib
ws2_32.lib
legacy_stdio_definitions.lib
```

---
以上でインストールと設定は完了です。リンク3.のサンプルコードなどで動作を確認してください。
不具合などありましたらコメントで知らせていただけると幸いです。