前提
- windows
- Visual Studio 2022
- Boostは現時点での最新バージョン(1.84.0)
- C++11以降
Boostのダウンロード
にアクセスし、Latest Releaseから最新のやつをダウンロード(.7zでも.zipでも可)
解凍しておく。
ビルド
コマンドプロンプトかPSを開いて、
.\bootstrap.bat
を実行。なんかファイルが色々作られる。
次に、
.\b2.exe install toolset=msvc runtime-link=static,shared asmflags=\safeseh address-model=32,64 -j9 --with-context --prefix=C:\Users\path\to\install
とすれば C:\path\to\installにincludeとlibフォルダを含むビルド結果が入れられる。
オプションについて補足
- toolsetではmsvcだったりgccだったりを指定する。msvcのバージョンまで正確に指定することもできる
- runtime-linkはCランタイムをどうリンクするかで、自分のプロジェクトだとstaticだけでよかったが、一応sharedも指定しておいた。デフォルトではsharedのみなので注意!
- with-hogehogeでそのライブラリのみをビルドする(後述)。複数のwith-hogeをオプションにつけることができる
- asmflags=\safeseh はBoost.Contextでwindowsのx86-32bit上でfcontext_tを使うために必要
他のオプションについては https://boostjp.github.io/howtobuild.html の下部を参照のこと。
ビルドするライブラリについて補足
Boostはheaderのみでビルドせず使えるモジュールと、ビルドが必要なモジュールがある。
Boost.Coroutine2自体はビルドがいらないが、それが依存しているBoost.Contextにビルドが必要。よって今回は--with-contextとした。
なお、Boost.CoroutineというCoroutine2に置き換えられたライブラリはビルドがいるのですが、2では使わないので--with-coroutineは不要。
ライブラリの一覧は、
./b2 --show-libraries
で見ることができる。
プロジェクトの設定
VisualStudioで 構成プロパティ→C/C++→全般→追加のインクルードディレクトリ を開き、先ほどビルドした結果のinclude\boost_1_84_0をパスに追加する。
同様に、構成プロパティ→リンカー→全般→追加のライブラリディレクトリ を開き、先ほどビルドした結果のlibをパスに追加する。
インストールの確認
#include <boost/coroutine2/all.hpp>
が動けばとりあえず導入は成功している。が、以下に注意。
注意
Coroutine2(Context)ではコンテキストにfcoutext_tかucontext_tを使える。
を見る限り、fcontext_tを使ったほうがいいだろう。windows環境でこれを使うには罠がいくつかある。
に書いてあるのだが、** コンパイル時に/GLオプションをoffにして、/EHsオプションを付けないといけない。**
これを忘れると、リリースビルドの時に/GLがついてて壊れたりする。
また、現在自分が使っているContextがfcontext_tかucontext_tかを判定する方法も現在調査中。だれか教えてください。
2024/03/11追記:コンパイル時にどちらの実装を使うか決まる。デフォルトだとfcontext_tなのでそのままでよい。
参考文献
BoostJP How To Build https://boostjp.github.io/howtobuild.html
BoostJP Coroutine2 https://boostjp.github.io/tips/coroutine.html
Boost Coroutine2 https://www.boost.org/doc/libs/1_84_0/libs/coroutine2/doc/html/coroutine2/overview.html
MSVC Compiler Option https://learn.microsoft.com/en-us/cpp/build/reference/eh-exception-handling-model?view=msvc-170