このページの内容

2. インストール

2.1. pugixmlの入手

pugixmlはソース形式で配布されています。ソース配布物をダウンロードするか、Gitリポジトリをクローンできます。

2.1.1. ソース配布物

最新のソース配布物はアーカイブとしてダウンロードできます。

pugixml-1.16.zip(Windows形式の改行) / pugixml-1.16.tar.gz(Unix形式の改行)

配布物には、ライブラリのソース、文書(今読んでいるこのマニュアルとクイックスタートガイド)、コード例が含まれています。配布物をダウンロードしたら、圧縮アーカイブ内のすべてのファイルを展開してpugixmlをインストールしてください。

古い版が必要な場合は、バージョンアーカイブからダウンロードできます。

2.1.2. Gitリポジトリ

Gitリポジトリはhttps://github.com/zeux/pugixml/にあります。各バージョンにはGitタグ"v{version}"があり、常に最新の安定版リリースを指す"latest"タグもあります。

たとえば、現在の版をチェックアウトするには、次のコマンドを使えます。

git clone https://github.com/zeux/pugixml
cd pugixml
git checkout v1.16

リポジトリには、ライブラリのソース、文書、コード例、完全な単体テストスイートが含まれています。

新しい版を自動的に取得したい場合はlatestタグを使ってください。明示的な操作でのみ新しい版へ切り替えたい場合は、ほかのタグを使ってください。また、masterブランチには開発途中のコードが含まれていることに注意してください。新しいリリースを待たずにmasterから新機能やバグ修正を取得できる一方、構成によってはコードが動作しなくなることもあります。

2.1.3. パッケージ

pugixmlは、各種パッケージマネージャーを通じてパッケージとして入手できます。ほとんどのパッケージはメインリポジトリとは別に保守されているため、必ずしも最新の版を含んでいません。

各種システムのpugixmlパッケージの例を挙げます。これは網羅的な一覧ではありません。

2.2. pugixmlのビルド

pugixmlはソース形式で配布され、ビルド済みバイナリーは含まれていません。自分でビルドする必要があります。

pugixmlのソース全体は、ソースファイルpugixml.cppと、ヘッダーファイルpugixml.hpp、pugiconfig.hppの3ファイルで構成されています。pugixml.hppは、pugixmlのクラスや関数を使うためにインクルードする主要なヘッダーです。pugiconfig.hppは補助的な設定ファイルです(追加の設定オプションを参照)。このガイドの以降の説明では、#include "pugixml.hpp"でヘッダーが見つかるように、pugixml.hppがカレントディレクトリかプロジェクトのインクルードディレクトリのいずれかにあると仮定します。ただし、相対パス(例:#include "../libs/pugixml/src/pugixml.hpp")や、インクルードディレクトリからの相対パス(例:#include <xml/thirdparty/pugixml/src/pugixml.hpp>)も使えます。

2.2.1. ほかの静的ライブラリ・実行ファイルの一部としてビルドする

pugixmlをビルドする最も簡単な方法は、ソースファイルpugixml.cppを既存のライブラリや実行ファイルと一緒にコンパイルすることです。この手順はアプリケーションのビルド方法によって異なります。たとえばMicrosoft Visual Studio [1]、Apple Xcode、Code::Blocks、その他のIDEを使っている場合は、いずれかのプロジェクトにpugixml.cppを追加するだけです。

Microsoft Visual Studioを使っていて、プロジェクトでプリコンパイル済みヘッダーが有効になっていると、次のエラーメッセージが表示されます。

pugixml.cpp(3477) : fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

正しい解決方法は、pugixml.cppについてプリコンパイル済みヘッダーを無効にすることです。"Create/Use Precompiled Header"オプション(Propertiesダイアログ → C/C++ → Precompiled Headers → Create/Use Precompiled Header)を"Not Using Precompiled Headers"に設定してください。すべてのプロジェクト構成・プラットフォームについて設定する必要があります。オプションを編集する前に、Configurationで"All Configurations"、Platformで"All Platforms"を選択できます。

vs2005 プリコンパイル済みヘッダー設定 1
vs2005 プリコンパイル済みヘッダー設定 2
vs2005 プリコンパイル済みヘッダー設定 3
vs2005 プリコンパイル済みヘッダー設定 4

2.2.2. 独立した静的ライブラリとしてビルドする

pugixmlを独立した静的ライブラリとしてコンパイルすることもできます。この手順はアプリケーションのビルド方法によって異なります。pugixmlの配布物には、よく使われるいくつかのIDE・ビルドシステム用のプロジェクトファイルが付属しています。Apple XCode、Code::Blocks、Codelite、Microsoft Visual Studio 2005、2008、2010以降用のプロジェクトファイルと、CMakeおよびpremake4用の設定スクリプトがあります。ほかのソフトウェア用のプロジェクトファイルやビルドスクリプトの提出も歓迎します。フィードバックを参照してください。

Microsoft Visual Studioの各版には2つのプロジェクトがあります。1つはpugixml_vs2008.vcprojのような名前の、CRTを動的にリンクするものです。もう1つはpugixml_vs2008_static.vcprojのような名前の、CRTを静的にリンクするものです。アプリケーションで使うCRTと一致する方を選択してください。Microsoft Visual Studioで作成した新規プロジェクトの既定値は、CRTの動的リンクです。そのため、既定値を変更していなければ動的CRT版を使ってください。たとえばMicrosoft Visual Studio 2008ではpugixml_vs2008.vcprojです。

pugixmlプロジェクトをワークスペースへ追加するだけでなく、アプリケーションがpugixmlライブラリとリンクすることも確認する必要があります。Microsoft Visual Studio 2005/2008の場合は、アプリケーションのプロジェクトからpugixmlプロジェクトへの依存関係を追加できます。Microsoft Visual Studio 2010以降の場合は、代わりにアプリケーションのプロジェクトへ参照を追加する必要があります。ほかのIDEやシステムについては、それぞれの文書を参照してください。

Microsoft Visual Studio 2005/2008 Microsoft Visual Studio 2010+
vs2005 リンク設定 1
vs2005 リンク設定 2
vs2010 リンク設定 1
vs2010 リンク設定 2

2.2.3. 独立した共有ライブラリとしてビルドする

pugixmlを独立した共有ライブラリとしてコンパイルすることもできます。手順は通常、静的ライブラリの場合と似ています。ただし、pugixmlの配布物には設定済みのプロジェクトやスクリプトが含まれていないため、自分で用意する必要があります。一般に、GCCベースのツールチェーンでは、ほかのライブラリをDLLとしてビルドする場合と違いはありません。コンパイルフラグに-sharedを追加すれば十分です。MSVCベースのツールチェーンでは、エクスポートするシンボルをdeclspec属性で明示的に指定する必要があります。PUGIXML_APIマクロを、たとえばpugiconfig.hppで次のように定義すれば指定できます。

#ifdef _DLL
    #define PUGIXML_API __declspec(dllexport)
#else
    #define PUGIXML_API __declspec(dllimport)
#endif
注意
STL関連の関数を使う場合は、アプリケーションとpugixmlのSTL割り当てに同じヒープを使うよう、共有ランタイムライブラリを使ってください。MSVCでは、'Runtime library'プロパティに'Multithreaded DLL'または'Multithreaded Debug DLL'を選択します(/MDまたは/MDdリンカースイッチ)。また、プロジェクト間でランタイムライブラリの選択が一致していることも確認してください。

2.2.4. ヘッダーオンリーモードで使う

pugixmlはヘッダーオンリーモードでも使用できます。これは、pugixml.hppをインクルードするすべての翻訳単位に、pugixmlのソースコード全体が含まれることを意味します。BoostやSTLのライブラリの多くはこの方法で動作しています。

この方法には利点も欠点もあります。ツールチェーンがリンク時最適化に対応していない場合や、それを無効にしている場合には、多くの単純な関数がインライン化されるため、ヘッダーモードでツリーの走査・変更性能が向上することがあります。リンク時最適化を使う場合の性能は、ヘッダーオンリーでないモードと同程度になるはずです。ただし、コンパイラーはpugixmlをインクルードする翻訳単位ごとにそのソースをコンパイルしなければならないため、コンパイル時間が大幅に増えることがあります。ヘッダーモードで使いたいもののXPathは不要な場合は、PUGIXML_NO_XPATHの定義でXPathを無効にし、コンパイル時間を短縮することを検討できます。

ヘッダーオンリーモードを有効にするには、PUGIXML_HEADER_ONLYを定義する必要があります。pugiconfig.hppに定義するか、コンパイラーのコマンドラインで指定できます。

PUGIXML_HEADER_ONLYが定義されていても、pugixml.cppをコンパイルして問題ありません。たとえばRelease構成だけでヘッダーオンリーモードを使いたい場合は、pugixml.cppをプロジェクトに含め(ほかの静的ライブラリ・実行ファイルの一部としてビルドする方法を参照)、次のようにpugiconfig.hppで条件付きでヘッダーオンリーモードを有効にできます。

#ifndef _DEBUG
    #define PUGIXML_HEADER_ONLY
#endif

2.2.5. 追加の設定オプション

pugixmlはいくつかの定義を使ってコンパイル処理を制御します。定義方法は2つあります。必要な定義をpugiconfig.hppに記述する(コメントアウトされた例がいくつかあります)か、コンパイラーのコマンドラインで指定します。一貫性が重要です。アプリケーション全体で、pugixml.hppをインクルードするすべてのソースファイル(pugixmlのソースも含む)の定義を一致させてください。pugiconfig.hppへ定義を追加すれば、この一致を保証できます。ただし、マクロ定義をプリプロセッサーの#ifや#ifdef指令で囲んでいて、その指令が一貫していない場合は除きます。pugiconfig.hppに初めから入っているのは常にコメントだけなので、新しい版へ更新するときにも、自分で変更した版をそのまま安全に残せます。

PUGIXML_WCHAR_MODEの定義は、UTF-8形式のインターフェース(メモリー内のテキストをUTF-8と仮定し、ほとんどの関数が文字型としてcharを使う)と、UTF-16/32形式のインターフェース(wchar_tのサイズに応じてメモリー内のテキストをUTF-16/32と仮定し、ほとんどの関数が文字型としてwchar_tを使う)を切り替えます。詳細はUnicodeインターフェースを参照してください。

PUGIXML_CHARCONV_FLOATを定義すると、浮動小数点数の書式設定に<stdio.h>の関数ではなく<charconv>を使います。これにはC++17とUTF-8インターフェースが必要です。この場合、変換はロケールを無視し、常に既定のCロケールを使う場合と同じように動作します。

PUGIXML_COMPACTの定義は、文書保存の内部表現を別のものへ切り替えます。ノードや属性などのマークアップが多い文書では、メモリー効率が大幅に向上しますが、解析やアクセスは少し遅くなります。詳細はコンパクトモードを参照してください。

PUGIXML_NO_XPATHの定義はXPathを無効にします。XPathのインターフェースと実装の両方がコンパイル対象から除かれます。このオプションは、XPathの機能が不要でコードサイズを節約したい場合のために用意されています。

PUGIXML_NO_STLの定義は、pugixmlでのSTLの使用を無効にします。このマクロを定義すると、STL型を扱う関数(iostream経由の読み込み・保存など)がなくなります。このオプションは、対象プラットフォームに標準準拠のSTL実装がない場合のために用意されています。

PUGIXML_NO_EXCEPTIONSの定義は、pugixmlでの例外の使用を無効にします。このオプションは、対象プラットフォームが例外処理機能を持たない場合のために用意されています。

PUGIXML_API、PUGIXML_CLASS、PUGIXML_FUNCTIONの定義により、pugixmlのクラスや非メンバー関数に独自の属性(declspecや呼び出し規約など)を指定できます。PUGIXML_CLASSやPUGIXML_FUNCTIONが定義されていない場合は、代わりにPUGIXML_APIの定義が使われます。たとえば、呼び出し規約を固定するには、PUGIXML_FUNCTIONを__fastcallなどと定義できます。別の例として、MSVCのDLLインポート・エクスポート属性があります(独立した共有ライブラリとしてビルドする方法を参照)。

注記
この例では、PUGIXML_APIが複数のソースファイル間で一致していません。これは一貫性の規則の例外です。

PUGIXML_MEMORY_PAGE_SIZE、PUGIXML_MEMORY_OUTPUT_STACK、PUGIXML_MEMORY_XPATH_PAGE_SIZEは、特定の重要なサイズを調整し、アプリケーション固有の使用パターンに合わせてメモリー使用量を最適化するために使えます。詳細はメモリー消費の調整を参照してください。

PUGIXML_HAS_LONG_LONGの定義は、pugixmlでのlong long型のサポートを有効にします。この定義は、プラットフォームがlong longに対応していると分かっている場合(C++11に対応している場合や、既知のコンパイラーの比較的新しい版を使う場合など)には自動で有効になります。実際にはlong longに対応しているのにpugixmlがそれを認識しない場合は、手動で定義を有効にできます。

PUGIXML_HAS_STRING_VIEWの定義は、std::string_view引数を取る関数のオーバーロードを有効にします。C++17以降を対象にビルドすると、この定義は自動で有効になります。実際にはstd::string_viewに対応しているのにpugixmlがそれを認識しない場合は、手動で定義を有効にできます。

2.3. 移植性

pugixmlは標準準拠のC++で書かれており、必要な箇所ではコンパイラー固有の回避策を使っています。C++98以降のどのC++標準でもコンパイルできます。新しい標準では追加機能が自動で有効になります。C++11ではムーブ意味論と範囲for文、C++17ではstd::string_viewのオーバーロードが有効になります。各版は、コードカバレッジが99%を超える単体テストスイートで検査されています。

pugixmlはさまざまなデスクトッププラットフォーム(Microsoft Windows、Linux、FreeBSD、Apple MacOSX、Sun Solarisなど)、ゲーム機(Microsoft Xbox 360、Microsoft Xbox One、Nintendo Wii、Sony Playstation Portable、Sony Playstation 3など)、モバイルプラットフォーム(Android、iOS、BlackBerry、Samsung bada、Microsoft Windows CEなど)で動作します。

pugixmlは、x86/x86-64、PowerPC、ARM、MIPS、SPARCなどのさまざまなアーキテクチャに対応しています。一般に、アーキテクチャ固有のコードを使わず、非アラインメモリーアクセスなどの機能にも依存していないため、どのアーキテクチャでも動作するはずです。

pugixmlはどのC++コンパイラーでもコンパイルできます。Microsoft Visual C++の6.0から2026までのすべての版、GCCの3.4から16まで、Clangの3.2から21までに加え、Borland C++、Digital Mars C++、Intel C++、Metrowerks CodeWarrior、PathScaleなど、さまざまなコンパイラーで検査されています。コードは、警告レベルをかなり高くしてもコンパイル警告が出ないように書かれています。

一部のプラットフォームでは、C++のサポートがごく限られている場合があります。問題なくコンパイルするには、PUGIXML_NO_STLやPUGIXML_NO_EXCEPTIONSを使う必要がある場合もあります。これは主に、古いゲーム機や組み込みシステムに当てはまります。


1。使用しているすべての商標は、それぞれの所有者に帰属します。