boostをVisual Studio 2019で使う方法

この記事は、Windows の Visual Studio 2019 で boost を導入した際のメモです。

目次

はじめに

環境

  • Windows 10 Home(64bit)
  • Visual Studio Community 2019

注意

boost には、ビルドなしで使える機能も多くあります。そのため、利用したい機能がビルド不要な場合、必ずしもビルドをする必要はありません。

どの機能がビルド不要なのかは、boostjpを見れば分かります。

手順

1.ダウンロード

boost 公式から「boost◯◯.zip」をダウンロードします。

boostのダウンロード

今回は「boost_1_70_0.zip」をダウンロードしました。以降、「1_70_0」などの表記は、ご自身がダウンロードしたバージョンに読み替えてください。

2.解凍

ダウンロードしたファイルを解凍します。Windows 標準の展開を使っても良いですし、解凍ソフトを使っても構いません。

解凍先はどこでも良いですが、なるべく浅い階層においておいたほうが楽です。今回は、C ドライブ直下(C:\\boost_1_70_0)に置きました。

※「ドキュメント」のような場所に置いてしまうと、フォルダのパスが「C:\\Users\\%username%\\Documents」のように長くなってしまいます。このパスは何度か入力することになるので、解凍先はパスが短くなる場所をおすすめします。

3.ビルド

コマンドプロンプトを管理者権限で起動します。(PowerShell が好きな方は、そちらを使っても構いません)

  1. 左下のスタートボタン(Windows マーク)を右クリック
  2. 「コマンドプロンプト(管理者)」をクリック
    コマンドプロンプト(管理者権限)
  3. 確認画面が表示されるので、「はい」をクリック

次に、先程解凍したフォルダを置いた場所に移動します。コマンドプロンプトに「cd C:\\boost_1_70_0」などと入力し、Enter を押してください(「C:\\boost_1_70_0」の部分は、自分が boost を置いたフォルダを指定します)。

C:\WINDOWS\system32>cd C:\\boost_1_70_0

C:\boost_1_70_0>

移動できたら、「bootstrap.bat」と入力し、Enter を押します。

C:\boost_1_70_0>bootstrap.bat

Building Boost.Build engine
Generating Boost.Build configuration in project-config.jam for msvc...
Bootstrapping is done. To build, run:
.\b2
To adjust configuration, edit 'project-config.jam'.
Further information:
- Command line help:
.\b2 --help
- Getting started guide:
http://boost.org/more/getting_started/windows.html
- Boost.Build documentation:
http://www.boost.org/build/

C:\boost_1_70_0>

最後に、「.\b2」を実行します。特に何も考えずにインストールするならば、

.\b2 -j(CPUのスレッド数) --prefix=(インストールしたいフォルダのパス) install

と指定すれば良いと思います。例えば、CPU のスレッド数が 2 で、C ドライブ直下の「Boost」フォルダにインストールしたいのであれば、

C:\boost_1_70_0>.\b2 -j2 --prefix=C:\\Boost install

となります。(この場合、インクルードディレクトリは「C:\\Boost\\include\\boost-1_70」、ライブラリディレクトリは「C:\\Boost\\lib」のようになるはずです)

もしインストールする場所やライブラリの種類を細かく指定したい場合は、オプションを指定してビルドします。

私は、以下の 2 つのコマンドを実行しました。

このコマンドをコピペする場合は、後述するオプションの意味をよく読んでから実行してください。このコマンドでなにか不都合があったとしても、私は責任を取ることができません
.\b2 toolset=msvc-14.2 threading=multi variant=debug,release link=static runtime-link=static,shared address-model=32 -j6 --libdir=C:\\Boost\\lib\\x86 install

.\b2 toolset=msvc-14.2 threading=multi variant=debug,release link=static runtime-link=static,shared address-model=64 -j6 --libdir=C:\\Boost\\lib\\x64 install

補足:オプションの意味

ここには書かれていないオプションもあります。きちんと知りたい方は、boost.org などを参考にしてください。

toolset=msvc-14.2

VS2019 のコンパイラでビルドする。

引数とコンパイラの関係は次の通り。

  • msvc-14.0:VS2015
  • msvc-14.1:VS2017
  • msvc-14.2:VS2019

threading=multi

スレッドセーフになる……らしい。

参考(Stack Overflow)

variant=debug,release

デバッグ用とリリース用。両方を指定すれば良いと思う。

link=static

static なら lib ファイル(静的ライブラリ)、shared なら dll ファイル(共有ライブラリ)を生成する。

runtime-link=static,shared

Visual Studio の「プロジェクトのプロパティ → 構成プロパティ →C/C++→ コード生成 → ランタイム ライブラリ」の設定

  • static→「マルチスレッド」
  • shared→「マルチスレッド DLL」

に対応している。両方を指定しておくのが無難。

参考(Stack Overflow)

address-model=◯◯

32bit 用なら 32、64bit 用なら 64 を指定する。

-j◯

並列でいくつのビルド作業を行うかを指定する。基本的には、CPU のコア数もしくはスレッド数と同じで良いと思う。よくわからないという人は、-j4(低スペックなパソコンなら-j2)あたりを指定すれば問題ないはず。

--libdir=C:\\Boost\\lib\\x◯◯

ライブラリを置くフォルダのパスを指定する。これを指定することで、ライブラリの置き場を 32bit 用・64bit 用で分けている。

4.Visual Studio の設定

今回は、32bit 用のプログラムで boost を使ってみます。

※インクルードディレクトリ・ライブラリディレクトリは、ビルド時の設定に合わせて変更してください。

  1. 「プロジェクト」から「◯◯(プロジェクト名)のプロパティ」を開く
  2. 左上の「構成」から「すべての構成」を選択する
  3. 構成プロパティC/C++全般追加のインクルードディレクトリ」を開く
  4. インクルードディレクトリ(今回は「C:\Boost\include\boost-1_70」)を追加する
    インクルードディレクトリの設定
  5. 「適用」をクリック
  6. 構成プロパティリンカー全般追加のライブラリディレクトリ」を開く
  7. ライブラリのディレクトリ(今回は「C:\Boost\lib\x86」)を追加する
    ライブラリディレクトリの設定
  8. 「適用」をクリックし、「OK」を押す

インクルードディレクトリ・ライブラリディレクトリは、

  1. 項目をクリックしたときに右側に出てくるボタンを押す
  2. 「編集」をクリックする
  3. 出てきたウィンドウの右上の方にある「新しい行」というボタンを押す
  4. パスを入力する
  5. 「OK」をクリックする

という手順で追加することができます。

5.テスト

テストとして、Qiita の記事にあるコードを実行してみます。

コード 1

#include <iostream>
#include <boost/version.hpp>

int main() {
  //バージョンの出力
  std::cout << "boost version:" << BOOST_VERSION << std::endl;
  std::cout << "boost lib version:" << BOOST_LIB_VERSION << std::endl;
  return 0;
}

結果 1(例)

boost version:107000
boost lib version:1_70

コード 2

#include <iostream>
#include <boost/asio.hpp>
namespace asio = boost::asio;
using asio::ip::tcp;

int main() {
  asio::io_service io_service;
  tcp::socket socket(io_service);
  boost::system::error_code error;
  socket.connect(tcp::endpoint(asio::ip::address::from_string("192.168.0.1"), 31400), error);
  if (error) std::cout << "未接続:" << error.message() << std::endl;
  else std::cout << "接続済み" << std::endl;
}

結果 2(例)

未接続:接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホスト が応答しなかったため、確立された接続は失敗しました。

もしリンクエラーが発生した場合は、先程の設定を改めて確認してください(特に、「構成」が「Debug」や「Rerease」になっていると、デバッグビルド/リリースビルドのどちらかでエラーが発生するので、注意してください)。

また、

  1. プロジェクトのプロパティを開く
  2. 左上の「構成」を「Debug」にする
  3. 「構成プロパティ →C/C++→ コード生成 → ランタイム ライブラリ」を「マルチスレッド デバッグ DLL」から「マルチスレッド デバッグ」にする
  4. 「適用」をクリックし、左上の構成を「Release」にする
  5. 同じ画面の「ランタイム ライブラリ」を「マルチスレッド DLL」から「マルチスレッド」にする
  6. 「適用」をクリックし、「OK」を押す

という手順を試してみてください。

※別のプロジェクトで boost を利用するときは、プロジェクトごとに Visual Studio の設定が必要です。

まとめ

boost はビルドこそ面倒ですが、1 度ビルドしてしまえば簡単に使うことができます。非常に便利なライブラリなので、どんどん使っていきましょう。

fiore
fiore

自称C++er。

comments powered by Disqus