「Boost.Regex ライブラリの導入」の版間の差分
| 190行目: | 190行目: | ||
細かい手順は以下に記述していきます。 | 細かい手順は以下に記述していきます。 | ||
まずは新しいソリューション構成のStaticDebugやStaticReleaseを新規作成します。そのために、ARM64がVisualStudioでは無効であるためにソリューション構成が追加できない状態になっているので、ARM64を消します。割かし面倒な作業になります。VisualStudioのメニュー[ビルド(B)]-[構成マネージャー(O)...]を起動します。表示されたウィンドウのアクティブソリューションプラットフォームのリストから[編集]を選択します。表示されたウィンドウで[プラットフォーム]欄から[ARM64]を選択して[削除]ボタンを押します。次に[閉じる]ボタンを押します。したらば、戻ったウィンドウで各プロジェクトのプラットフォーム列の値をすべて[ARM64]にします。ARM64は消したのにまだ選べるというのは問題で、選べないようにしないといけないので、プラットフォーム列の値を選択する一覧から[編集]を選択します。表示されたウィンドウで[プラットフォーム]欄から[ARM64]を選択して[削除]ボタンを押します。次に[閉じる]ボタンを押します。これをすべてのプロジェクトのプラットフォーム列の値で繰り返し操作します。全部のプロジェクトに対して操作することでARM64を完全に消したことになります。したらば新しいソリューション構成が追加できる状態になったので、新しいソリューション構成のリストから[新規作成]を選択します。[名前]欄にStaticDebugと入力し、[設定のコピー元]欄をDebugに設定して、新しいプロジェクト構成を作成するのチェックボックスはOnのままにして[OK]ボタンを押します。おなじようにしてStaticRealeaseも作成します。新しいソリューション構成のリストから[新規作成]を選択します。[名前]欄にStaticReleaseと入力し、[設定のコピー元]欄をReleaseに設定して、新しいプロジェクト構成を作成するのチェックボックスはOnのままにして[OK]ボタンを押します。そしたら、StaticDebugとStaticReleaseの両方の構成に対して以下の設定を行います。これから何度もプロジェクトのプロパティを設定しますが、プロパティウィンドウの左上の構成欄が目的の構成に対して操作しているか確認して操作して下さい。StaticDebugとStaticReleaseについて操作します。 | |||
1.プリプロセッサの定義を追加する。makedataプロジェクト以外の全てのプロジェクトに対して。 | |||
ソリューションエクスプローラにある各プロジェクトを選択して[Alt]+[Enter]を入力して表示されるダイアログ、各プロジェクトのプロパティダイアログで項目[構成プロパティ]-[C/C++]-[プリプロセッサ]の項目[プリプロセッサの定義]に | |||
U_STATIC_IMPLEMENTATION; | |||
を追記します。最後の;(セミコロン)は区切りとしての意味があります。U_STATIC_IMPLEMENTATIONマクロを定義することによって、スタティック版ライブラリを生成するために必要な動作に切り替わる部分がいくつかあります。厳密には全部のプロジェクトに対してマクロ定義する必要は無く、U_STATIC_IMPLEMENTATIONによって動作が変化する部分を保持しているプロジェクトに対してのみマクロ定義するとよいはずです。 | |||
2.構成の種類がダイナミックライブラリ(.dll)になっているプロジェクトをスタティックライブラリ(.lib)に切り替える。 | |||
ソリューションエクスプローラにある各プロジェクトを選択して[Alt]+[Enter]を入力して表示されるダイアログ、各プロジェクトのプロパティダイアログで項目[構成プロパティ]-[全般]の項目[構成の種類]を確認して、ダイナミックライブラリ(.dll)となっている部分を | |||
スタティックライブラリ(.lib)に変更します。 | |||
に変更します。ICU77-1では | |||
*common | |||
*ctestfw | |||
*i18n | |||
*io | |||
*stubdata | |||
*testplug | |||
*toolutil | |||
の8プロジェクトがあります。 | |||
3.コード生成がStaticDebugではマルチスレッドデバッグDLL(/MDd)になっているのをマルチスレッドデバッグ(/MTd)に変更する。StaticReleaseではマルチスレッドDLL(/MD)になっているのをマルチスレッド(/MT)に変更します。 | |||
ソリューションエクスプローラにある各プロジェクトを選択して[Alt]+[Enter]を入力して表示されるダイアログ、各プロジェクトのプロパティダイアログで項目[構成プロパティ]-[C/C++]-[コード生成]の項目[ランタイムライブラリ]について、 | |||
StaticDebugではマルチスレッドデバッグDLL(/MDd)になっているのをマルチスレッドデバッグ(/MTd)に変更。 | |||
StaticReleaseではマルチスレッドDLL(/MD)になっているのをマルチスレッド(/MT)に変更。 | |||
この設定によって生成されるlibを使用するプロジェクトでは、同じようにコード生成の設定を(/MTd)あるいは(/MT)にする必要があります。つまりランタイムはDLL方式にすることはできません。 | |||
2025年10月9日 (木) 17:01時点における版
言語と開発環境に戻る。
概要
Boost.Regexは正規表現による文字列の検索・置換の処理を高速かつ多機能にするライブラリです。標準ライブラリのstd::regexもありますが、大きな違いが認められるほどのモノで利用者も多いライブラリです。人気。ですね。Boost.RegexはBoostというライブラリの正規表現に関する部分的なライブラリで、全部を導入しなくててもBoost.Regexだけを単独で、つまりスタンドアローンモードで使うことができるとされています。
ここでは、Boost.Regexのスタンドアローンモードでの導入方法・インストール・ビルド?・設定について記述したいと思います。ただし、記事作成中にあっては、管理人も使い方をわからない手探りで進めていく感じなので、記事が完成するまでは、ただの日記です。難しそうなので、考えながらやっていく感じです。
まずは入手についてですが、github(巨大なソースコード集積siteです)から入手します。https://github.com/boostorg/regexからCodeボタンのDownload ZIPを選択すると一式を入手できます。ログインしていないと簡単にはダウンロード出来ません。
これでBoost.Regexだけを入手できたので、includeディレクトリのファイルとsrcディレクトリのファイルがあれば都度link処理は必要になりますが、Boost.Regexの各種関数が使えるようになります。あとはUnicodeの全てを司るICUライブラリを使うかとかの調整が必要になるのかな。
libファイルがあれば、includeファイルとlibファイルの組み合わせで扱うこともできますが、libファイルを作るにはBoost全体を入手して、Boostrap.batファイルを動かしたあとにb.exeを使ってlibファイルを生成するような手順が必要になります。
srcがあれば、デバッグも内部まで追いかけることができて勉強になったりもしますので、一長一短ですね。何長何短かは考え方次第です。時間があればlibファイルを使う手順もあとで追記してみたいと思います。ここではまず最初にソースとインクルードファイルだけで扱ってみたいと思います。ICUありと無しもね。まずは無しから。
特定のプロジェクトだけで使う場合
Boost.Regexを何度も使うときには、いつでも使えるように、特定のディレクトリにおいておいて、ちょっとプロジェクトを設定すれば使えるみたいにして使うのがオススメですが、特定のプロジェクトだけで使う場合はプロジェクトのフォルダの中にソースとインクルードファイルを読み込ませればよいわけです。具体的にやってみましょう。
Boost.Regexのexampleフォルダにあるコンソールアプリケーションサンプルを動かしてみます。なので、Windowsコンソールアプリケーションを作る要領で新規プロジェクトを作成します。
そしたら、プロジェクトの*.vcxprojファイルのあるフォルダにboost-regexという名前のフォルダを作って、boost.regexのファイル一式のregex-developフォルダの中にあるincludeフォルダとsrcフォルダをboost-regexの中に貼り付けましょう。
そしたらexampleプログラムをコピーしてmain関数が作成された「プロジェクト名.cpp」に貼り付けます。regex-developフォルダの中のexampleフォルダの中のsnippetsフォルダの中のregex_grep_example_1.cppはBoost.Regexだけで動かせるサンプルになっています。exampleフォルダの中のgrepフォルダの中にあるサンプルは動かせません。動かすにはBoost.program_optionsというリポジトリも必要になるためです。なので、Boost.Regexのリポジトリからもってきたファイル一式だからといって、exampleフォルダにある全部が動かせるとは限らないことに注意が必要です。
regex_grep_example_1.cppの中身をペロッと貼り付けます。
そしたら、以下のようにプロジェクトを設定します。
プロジェクトのプロパティから以下を設定します。
- [構成プロパティ]-[C/C++]-[全般]の「SDLチェック」を「いいえ(/sdl-)」を選択します。
- [構成プロパティ]-[VC++ディレクトリ]の「外部インクルードディレクトリ」の後部に「;boost-regex\include」を追記します。
- [構成プロパティ]-[デバッグ]の「コマンド引数」に「(プロジェクトファイルを作ったフォルダへのフルパス)\boost-regex\include\boost\regex\concepts.hpp」
このサンプルプログラムは、コマンド引数に与えられたファイルパスにあるファイルからclass定義を見つけてそのclass名を抽出する正規表現grepを実行するものです。なのでコマンド引数に、クラスを保持するテキストファイルへのパスを設定しました。デバッグ時はプロジェクトからの相対パスでもよいでしょう。実行ファイルから起動するときは、実行ファイルが配置されたディレクトリからの相対パスである必要があります。
Boost.Regexはstrcpyやstrcmpやstrcatなどの古い関数を使うのでSDL(Security Development Lifecycle)チェックをはずす必要もあります。
そして、ソリューションエクスプローラのソースファイルフィルタ項目の上で右クリックして表示されるメニューから[追加]-[既存の項目]を選択してプロジェクトを作成したディレクトリの中のBoost-Regexの中のsrcの中のソースファイル5つを選択してプロジェクトに追加します。
これで、準備ができたのでこのサンプルを動かすプロジェクトをビルドします。メニューの[ビルド]-[ソシューションのビルド]を実行します。ビルドがうまくいくと思います。
そしたら、ブレークポイントを設定しなくてもよいので、ローカルWindowsデバッガーボタンをおして実行してみましょう。
以下のような結果が得られます。
Processing file (プロジェクトファイルを作ったフォルダへのフルパス)\boost-regex\include\boost\regex\concepts.hpp
13 matches found
class "BaseRegexConcept" found at index: 8459
class "BitmaskConcept" found at index: 5600
class "BoostRegexConcept" found at index: 31770
class "RegexConcept" found at index: 24052
class "RegexTraitsConcept" found at index: 6054
class "allocator_architype" found at index: 2402
class "char_architype" found at index: 1279
class "functor1" found at index: 30965
class "functor1b" found at index: 31182
class "functor2" found at index: 31390
class "functor3" found at index: 31520
class "rebind" found at index: 2673
class "regex_traits_architype" found at index: 3794
(プロジェクトファイルを作ったフォルダへのフルパス)\x64\Debug\BoostSample.exe (プロセス 4908) は、コード 0 で終了しました。
デバッグが停止したときに自動的にコンソールを閉じるには、[ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自 動的にコンソールを閉じる] を有効にします。
このウィンドウを閉じるには、任意のキーを押してください...
特定のプロジェクトにBoost.Regexを追加して、ビルドする手順は習得できたので、これで一つの使い方についてできることになったわけですからBoost.Regexを使えるようになったということです。次はICUを使う例を紹介したいですが、以前にICUを使ったときからはパソコンが入れ替わっているので、また導入からになります。ICU...また後日、記事を追加することになります。今は、説明することはしばらく保留にしておきたいと思います。使えるのが大事だからね。
ライブラリを生成する場合
ライブラリを生成する場合はBoost_Regexだけのプロジェクト単体でダウンロードしていたのでは、割かし手順が複雑になってしまいますので、Boost全体をダウンロードした方がよいです。単体から引っ張り出す場合でも結局全部ダウンロードする感じになっている気もします。勘違いならゴメン。なのでBoostをダウンロードしよう!
https://www.boost.org/users/history/version_1_89_0.html
割かし大きいことに驚かされますがビビることはない。ハードディスクに空きと通信の手段と時間さえあれば、やれる。
解凍したら、コマンドプロンプトを立ち上げて解凍してできたディレクトリをカレントディレクトリにしよう。解凍したフォルダはあまり深いところに置かない方がいいです。C:¥boost_1_89_0\とかにするのもいいね。こういうboost_1_89_0までのパスを(Boostルートパス)と表現するとしよう。
(Boostルートパス)>bootstrap.bat
ってやると、b2っていうコマンドが使えるようになるツールを生成してくれます。したらば
(Boostルートパス)>b2 variant=debug link=static runtime-link=shared --with-regex
のようにして、regexのdebug版のライブラリを生成し
(Boostルートパス)>b2 variant=release link=static runtime-link=shared --with-regex
のようにして、regexのrelease版のライブラリを生成します。
以下のようなファイルが生成されます。x32の方はあまりいらないね。gdの方がデバッグ版ね。
- libboost_regex-vc143-mt-gd-x32-1_89.lib
- libboost_regex-vc143-mt-gd-x64-1_89.lib
- libboost_regex-vc143-mt-x32-1_89.lib
- libboost_regex-vc143-mt-x64-1_89.lib
(Boostルートパス)\stage\libというフォルダにlibファイルが生成されます。やったね。これとboostフォルダの中にあるincludeファイルを参照できるようにプロジェクトに設定すればboostが使えるよ。
#include <boost\regex.hpp>
のように指定して使えるようにインクルードパスの設定を追加しようね!
ICU対応版スタティックライブラリを生成する場合
ICU対応版Boost.Regexライブラリが欲しいという稀有な人向けの記事です。ICUとBoost.Regex自体はDLLを使った動的なリンクでの利用なら、前項の方法で生成したライブラリと組み合わせて使うことができますのでこの項目の手順は不要です。
まずはICUのスタティックライブラリを生成する必要があります。*.libにはDLLでの利用を想定したライブラリファイルであるインポートライブラリと全部丸っと実行ファイルにコードを保持するためのスタティックライブラリがあります。
ICUのソースをダウンロードしてきて、スタティック版生成のためのプリプロセッサの定義をして、出力をDLL出力形式からlibファイル出力形式に切り替えて、コード生成方式を/MDや/MDd(デバッグ版)のDLL方式から/MTや/MTdに変更して、libファイルを名前を変えてlib出力ディレクトリに集約するビルド後イベントのコマンドを追加したり、makedataプロジェクトのMAKE時にスタティックオブジェクトからsicudt.libファイルを生成する処理なんかを追加します。
細かい手順は以下に記述していきます。
まずは新しいソリューション構成のStaticDebugやStaticReleaseを新規作成します。そのために、ARM64がVisualStudioでは無効であるためにソリューション構成が追加できない状態になっているので、ARM64を消します。割かし面倒な作業になります。VisualStudioのメニュー[ビルド(B)]-[構成マネージャー(O)...]を起動します。表示されたウィンドウのアクティブソリューションプラットフォームのリストから[編集]を選択します。表示されたウィンドウで[プラットフォーム]欄から[ARM64]を選択して[削除]ボタンを押します。次に[閉じる]ボタンを押します。したらば、戻ったウィンドウで各プロジェクトのプラットフォーム列の値をすべて[ARM64]にします。ARM64は消したのにまだ選べるというのは問題で、選べないようにしないといけないので、プラットフォーム列の値を選択する一覧から[編集]を選択します。表示されたウィンドウで[プラットフォーム]欄から[ARM64]を選択して[削除]ボタンを押します。次に[閉じる]ボタンを押します。これをすべてのプロジェクトのプラットフォーム列の値で繰り返し操作します。全部のプロジェクトに対して操作することでARM64を完全に消したことになります。したらば新しいソリューション構成が追加できる状態になったので、新しいソリューション構成のリストから[新規作成]を選択します。[名前]欄にStaticDebugと入力し、[設定のコピー元]欄をDebugに設定して、新しいプロジェクト構成を作成するのチェックボックスはOnのままにして[OK]ボタンを押します。おなじようにしてStaticRealeaseも作成します。新しいソリューション構成のリストから[新規作成]を選択します。[名前]欄にStaticReleaseと入力し、[設定のコピー元]欄をReleaseに設定して、新しいプロジェクト構成を作成するのチェックボックスはOnのままにして[OK]ボタンを押します。そしたら、StaticDebugとStaticReleaseの両方の構成に対して以下の設定を行います。これから何度もプロジェクトのプロパティを設定しますが、プロパティウィンドウの左上の構成欄が目的の構成に対して操作しているか確認して操作して下さい。StaticDebugとStaticReleaseについて操作します。
1.プリプロセッサの定義を追加する。makedataプロジェクト以外の全てのプロジェクトに対して。
ソリューションエクスプローラにある各プロジェクトを選択して[Alt]+[Enter]を入力して表示されるダイアログ、各プロジェクトのプロパティダイアログで項目[構成プロパティ]-[C/C++]-[プリプロセッサ]の項目[プリプロセッサの定義]に
U_STATIC_IMPLEMENTATION;
を追記します。最後の;(セミコロン)は区切りとしての意味があります。U_STATIC_IMPLEMENTATIONマクロを定義することによって、スタティック版ライブラリを生成するために必要な動作に切り替わる部分がいくつかあります。厳密には全部のプロジェクトに対してマクロ定義する必要は無く、U_STATIC_IMPLEMENTATIONによって動作が変化する部分を保持しているプロジェクトに対してのみマクロ定義するとよいはずです。
2.構成の種類がダイナミックライブラリ(.dll)になっているプロジェクトをスタティックライブラリ(.lib)に切り替える。
ソリューションエクスプローラにある各プロジェクトを選択して[Alt]+[Enter]を入力して表示されるダイアログ、各プロジェクトのプロパティダイアログで項目[構成プロパティ]-[全般]の項目[構成の種類]を確認して、ダイナミックライブラリ(.dll)となっている部分を
スタティックライブラリ(.lib)に変更します。
に変更します。ICU77-1では
- common
- ctestfw
- i18n
- io
- stubdata
- testplug
- toolutil
の8プロジェクトがあります。
3.コード生成がStaticDebugではマルチスレッドデバッグDLL(/MDd)になっているのをマルチスレッドデバッグ(/MTd)に変更する。StaticReleaseではマルチスレッドDLL(/MD)になっているのをマルチスレッド(/MT)に変更します。
ソリューションエクスプローラにある各プロジェクトを選択して[Alt]+[Enter]を入力して表示されるダイアログ、各プロジェクトのプロパティダイアログで項目[構成プロパティ]-[C/C++]-[コード生成]の項目[ランタイムライブラリ]について、
StaticDebugではマルチスレッドデバッグDLL(/MDd)になっているのをマルチスレッドデバッグ(/MTd)に変更。
StaticReleaseではマルチスレッドDLL(/MD)になっているのをマルチスレッド(/MT)に変更。
この設定によって生成されるlibを使用するプロジェクトでは、同じようにコード生成の設定を(/MTd)あるいは(/MT)にする必要があります。つまりランタイムはDLL方式にすることはできません。
そしてB2ビルドでstatic版を得るためのコマンドを実行するだけです。
b2 --build-type=complete --toolset=msvc cxxflags="/std:c++17" architecture=x86 address-model=64 variant=debug link=static runtime-link=static --with-regex define=BOOST_REGEX_HAS_ICU -sICU_PATH=C:\(ICUのルートパス)\icu4c stage linkflags="Advapi32.lib"
言語と開発環境に戻る。