ノート
この応答は少し前に書かれたもので、moはXcode6以降で動作しなくなりました。この問題に対する最新の回答については、このリンクを確認してください。
序章
iOSアプリにGDALを組み込むには、次の5つの手順が必要です。
- GDALWebサイトからGDALソースコードをダウンロードします
- 以下に示すconfigure/build/installスクリプトを実行します
- 結果の静的ライブラリをインクルードファイルと一緒にiOSプロジェクトに追加します
- iOSプロジェクトの追加ライブラリとリンクする
- コーディングを開始...GDALとOGRのチュートリアルは良い出発点です
GDALのダウンロード
GDALはC++オープンソースライブラリであり、www.gdal.orgWebサイトからダウンロードできます。執筆時点での最新バージョンは1.9.0です。可能であれば、最新の安定バージョンをダウンロードする必要があります。
スクリプトを実行して、iOSおよびシミュレーター用のGDALをコンパイルします
iOSプロジェクトでGDALを使用するには、ソースコードを静的ライブラリ(.a)としてコンパイルする必要があります。iOS6でサポートされている最新のアーキテクチャでは、次のアーキテクチャの静的ライブラリを作成する必要があります。
- シミュレータ用のi386
- armv7 foriPhone3GSからiPhone4S
- iPhone5用armv7s
1つのアーキテクチャ用に構築する基本スクリプト
次のスクリプトは、pseudogreenを応用したもので、単一のアーキテクチャのソースコードをコンパイルするトリックを実行します。
このコードをコピーしてテキストエディタに貼り付け、拡張子が.shのファイル(例:build_gdal_ios.sh)として保存します。
これを使用するには、gdalソースコードをダウンロードしたディレクトリにスクリプトをコピーして、次のように実行します。
入力してヘルプを表示することもできsh build_gdal_ios.sh -h
ます。
#!/bin/bash
################################################################################
#
# Copyright (c) 2008-2009 Christopher J. Stawarz
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
################################################################################
# Disallow undefined variables
set -u
default_gcc_version=4.2
default_iphoneos_version=6.0
default_macos_version=10.8
default_architecture=armv7
default_prefix="${HOME}/Documents/iOS_GDAL"
GCC_VERSION="${GCC_VERSION:-$default_gcc_version}"
export IPHONEOS_DEPLOYMENT_TARGET="${IPHONEOS_DEPLOYMENT_TARGET:-$default_iphoneos_version}"
export MACOSX_DEPLOYMENT_TARGET="${MACOSX_DEPLOYMENT_TARGET:-$default_macos_version}"
DEFAULT_ARCHITECTURE="${DEFAULT_ARCHITECTURE:-$default_architecture}"
DEFAULT_PREFIX="${HOME}/Documents/iOS_GDAL"
echo Default architecture: $DEFAULT_ARCHITECTURE
usage ()
{
cat >&2 << EOF
Usage: ${0##*/} [-ht] [-p prefix] [-a arch] target [configure_args]
-h Print help message
-p Installation prefix (default: \$HOME/Documents/iOS_GDAL...)
-t Use 16-bit Thumb instruction set (instead of 32-bit ARM)
-a Architecture target for compilation (default: armv7)
The target must be "device" or "simulator". Any additional arguments
are passed to configure.
The following environment variables affect the build process:
GCC_VERSION (default: $default_gcc_version)
IPHONEOS_DEPLOYMENT_TARGET (default: $default_iphoneos_version)
MACOSX_DEPLOYMENT_TARGET (default: $default_macos_version)
DEFAULT_PREFIX (default: $default_prefix)
EOF
}
prefix="${DEFAULT_PREFIX}"
echo Prefix: $prefix
while getopts ":hp:a:t" opt; do
case $opt in
h ) usage ; exit 0 ;;
p ) prefix="$OPTARG" ;;
t ) thumb_opt=thumb ;;
a ) DEFAULT_ARCHITECTURE="$OPTARG" ;;
\? ) usage ; exit 2 ;;
esac
done
shift $(( $OPTIND - 1 ))
if (( $# < 1 )); then
usage
exit 2
fi
target=$1
shift
case $target in
device )
arch="${DEFAULT_ARCHITECTURE}"
platform=iPhoneOS
extra_cflags="-m${thumb_opt:-no-thumb} -mthumb-interwork"
;;
simulator )
arch=i386
platform=iPhoneSimulator
extra_cflags="-D__IPHONE_OS_VERSION_MIN_REQUIRED=${IPHONEOS_DEPLOYMENT_TARGET%%.*}0000"
;;
* )
echo No target found!!!
usage
exit 2
esac
platform_dir="/Applications/Xcode.app/Contents/Developer/Platforms/${platform}.platform/Developer"
platform_bin_dir="${platform_dir}/usr/llvm-gcc-${GCC_VERSION}/bin"
platform_sdk_dir="${platform_dir}/SDKs/${platform}${IPHONEOS_DEPLOYMENT_TARGET}.sdk"
prefix="${prefix}/${arch}/${platform}.platform/${platform}${IPHONEOS_DEPLOYMENT_TARGET}.sdk"
echo library will be exported to $prefix
export CC="${platform_bin_dir}/llvm-gcc-${GCC_VERSION}"
export CFLAGS="-arch ${arch} -pipe -Os -gdwarf-2 -isysroot ${platform_sdk_dir} ${extra_cflags}"
export LDFLAGS="-arch ${arch} -isysroot ${platform_sdk_dir}"
export CXX="${platform_bin_dir}/llvm-g++-${GCC_VERSION}"
export CXXFLAGS="${CFLAGS}"
export CPP="${platform_bin_dir}/llvm-cpp-${GCC_VERSION}"
export CXXCPP="${CPP}"
./configure \
--prefix="${prefix}" \
--host="${arch}-apple-darwin" \
--disable-shared \
--enable-static \
--with-unix-stdio-64=no \
"$@" || exit
make install || exit
cat >&2 << EOF
Build succeeded! Files were installed in
$prefix
EOF
このスクリプトにはいくつかのデフォルトパラメータがあり、SDKまたはLLVMAppleコンパイラでの設定や変更を反映するように変更できることに注意してください。
- default_gcc_version = 4.2
- default_iphoneos_version = 6.0
- default_macos_version = 10.8
- default_architecture = armv7
- default_prefix = "$ {HOME} / Documents / GDALLibrary"
そして今、複数のアーキテクチャのために構築しています
上記のスクリプト(build_gdal_ios.sh
)を使用すると、一度に1つのアーキテクチャを構築できます... 3用にコンパイルしてから、これらすべてのライブラリを1つの静的ライブラリファイルにまとめる必要があります。
次のスクリプトはそれを可能にします(build_gdal_all_ios.shなどの別の名前に保存します):
#!/bin/bash
make clean
./build_gdal_ios.sh -p ${HOME}/Documents/GDALLibrary -a armv7 device
make clean
./build_gdal_ios.sh -p ${HOME}/Documents/GDALLibrary -a armv7s device
make clean
./build_gdal_ios.sh -p ${HOME}/Documents/GDALLibrary simulator
このスクリプトを実行すると、ライブラリがサブフォルダの$ {HOME} / Documents/GDALLibraryディレクトリに保存されます。
- $ {HOME} /Documents/GDALLibrary/i386/iPhoneSimulator.platform/iPhoneSimulator6.0.sdk/lib
- $ {HOME} /Documents/GDALLibrary/armv7/iPhoneOS.platform/iPhoneSimulator6.0.sdk/lib
- $ {HOME} /Documents/GDALLibrary/armv7s/iPhoneOS.platform/iPhoneSimulator6.0.sdk/lib
これで、実行可能リポ(脂肪吸引用)を使用して、次のように3つのライブラリを1つのライブラリに結合できます。
lipo ${HOME}/Documents/GDALLibrary/i386/iPhoneSimulator.platform/iPhoneSimulator6.0.sdk/lib/libgdal.a ${HOME}/Documents/GDALLibrary/armv7/iPhoneOS.platform/iPhoneSimulator6.0.sdk/lib/libgdal.a ${HOME}/Documents/GDALLibrary/armv7s/iPhoneOS.platform/iPhoneSimulator6.0.sdk/lib/libgdal.a -output ${HOME}/Documents/GDALLibrary/libgdal.a -create
...そしてあなたは終わりました...
XCodeプロジェクトに静的ライブラリを追加します
この手順はかなり簡単です。
- Xcode(4.5)で新しいプロジェクトを作成するか、GDALを追加するプロジェクトを開きます
- ファイルエクスプローラーで右クリックし、[プロジェクトにファイルを追加]を選択します
- 上記で作成したlibgdal.aを、インクルードディレクトリの1つにあるインクルードファイルとともに選択します(3つのディレクトリには同じファイルが含まれています)
- 次のライブラリを(プロジェクトフレームワークリストから)XCodeプロジェクトに追加します。
- libstdc++。6.0.9.dylib
- libz.dylib
- libiconv.dylib
- libsqlite3.dylib
- libxml2.dylib(アーキテクチャarmv7の未定義のシンボルの場合: "_ xmlCatalogResolveSystem"など)
コードを作成します。すべて問題なくコンパイルできるはずです。
コーディングを開始する
ここにトリックがあります:Objective-C環境でC ++ライブラリ(およびヘッダーファイル)を使用しています。GDALヘッダーファイルの1つを.mファイルにインクルードすると、XCodeはC++構文について文句を言います。
ここに2つの解決策があります:
- すべてのGDALコードを.mmファイル内に記述します。XcodeはこれをObjective-C++ファイルとして認識し、コンパイルします。
- PhilJordanが優れた記事MixingObjective-C++ and C ++で説明しているように、Objective-Cファイルでクラス拡張を使用します。
ある時点で、いくつかのGDALコードサンプルを投稿します...しかし後で...