ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

Visual Studio 2005 + STLport 5.2.1 + boost 1.47.0 + 64bit対応

何度でもハマりますこの組み合わせ。
今回はメインのマシンを Windows 7 64bit にアップデートしたので、
32/64 両方の環境を構築します。

STLport 5.2.1 のインストール

STLport 5.2.1 の Makefilex86 環境用のクロスコンパイルに対応していないので、
難しいことは考えずに、ダウンロードしたソースを2か所に展開してお茶を濁すことに。

STLport-5.2.1
├ x86
│ ├ build
│ ├ doc
│ 
└ x64
  ├ build
  ├ doc

ほんとは stlport ディレクトリとか共有できるはずだけど…5MBにも満たないしいいよね?今時。

STLport 5.2.1 for x86

手順は id:Hossy:20091124:p1 このまま。特に変更点はなし。


なんか unit test の fail が増えたけど、フランスの通貨とか知らないから無視。
ググったらフランとかユーロらしい。へー。


念のために

> dumpbin /headers *.dll *.exe | grep machine

でみんな "14C machine (x86)" になっていることを確認。

STLport 5.2.1 for x64

x64 用のコンパイル環境で作業すること以外、基本的な手順は id:Hossy:20091124:p1 このまま。


ただし一か所だけ、コンパイル中に

../../src\allocators.cpp(683) : error C2039: '_M_next' : '_SLIST_ENTRY' のメンバではありません。
        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\include\
winnt.h(8218) : '_SLIST_ENTRY' の宣言を確認してください。

こんなエラーが出るので、メッセージ通り、src\allocators.cpp の 683 行目を

-    _Obj* __next = __chunk->_M_next;
+    _Obj* __next = __chunk->Next;

こんな風に修正しておきます。


念のために

> dumpbin /headers *.dll *.exe | grep machine

でみんな "8664 machine (x64)" になっていることを確認。


なんか unit test の fail がもいっこ増えたけど知らない。
ソース読んで試したら

std::cout << -std::numeric_limits<float>::quiet_NaN() << std::endl;

x86 版だと -nan なのに、x64 版だとなんか nan になる。

boost 1.47.0 のインストール

こちらは先人の方々が有用な情報を残してくれているのでそれらを参考に。
Life with open mind
http://www.softgate.jp/ja/portal/columns/42-column-cat-general/66-building-boost.html


まずはおなじみ、bjam のコンパイルから。
両方の環境で使いまわすのでどちらでもいいんですが、とりあえず x86 環境で

C:\boost> bootstrap.bat

と叩くだけ。なんか bjam.exe と b2.exe ができましたが...

C:\boost> md5sum bjam.exe b2.exe
9bffd927adf2d8feeddf0f00e46942a7 *bjam.exe
9bffd927adf2d8feeddf0f00e46942a7 *b2.exe

同じものらしいです。2文字削ってそんなに嬉しいか……?

boost 1.47.0 for x86

id:Hossy:20110615:p1 と同様に project-config.jam を編集します。

using msvc : 8.0 ;
using stlport : 5.2 : C:\\STLport\\x86\\stlport : C:\\STLport\\x86\\lib ;

STL のインクルードパスはともかく、ライブラリパスを間違えないように注意。


で、x86 コンパイル環境でビルド。

C:\boost> bjam --build-dir=build\x86 --stagedir=stage\x86 --build-type=complete stdlib=stlport-5.2 --without-python --without-mpi -j2 address-model=32 stage

いつもは install を使うのですが、共存のために stage で留めておきます。
それとディレクトリが被らないように設定して、アドレスモデルも追加しておきます。


しばらくすると C:\boost\stage\x86\lib にバイナリがたくさんできます。
LIB と PATH 両方に設定するのを忘れずに。INCLUDE は C:\boost でOK。

boost 1.47.0 for x64

基本的に x86 と変わらず。

project-config.jam の編集。

using msvc : 8.0 ;
using stlport : 5.2 : C:\\STLport\\x64\\stlport : C:\\STLport\\x64\\lib ;

ライブラリパスの x64 に注意。


で、x64 コンパイル環境でビルド。

C:\boost> bjam --build-dir=build\x64 --stagedir=stage\x64 --build-type=complete stdlib=stlport-5.2 --without-python --without-mpi -j2 address-model=64 stage

もろもろの数字が 64 に書き変わってるだけですね。


しばらくすると C:\boost\stage\x64\lib にバイナリがたくさんできます。
こちらも LIB と PATH に設定。


なんか昔は toolset に --toolset=msvc-8.0.amd64 とか指定してたようですが、
最新のドキュメントにはそんな記述はありませんでした。ただ address-model=64 を指定しろ、としか。
まあ、この辺ころころ変わるのはいつものことなので普通に公式情報に追従で。
http://www.dw-sapporo.co.jp/technology/tips/boost306e30b330f330a430eb65b96cd5-msvc8
http://www.boost.org/boost-build2/doc/html/bbv2/reference/tools.html#v2.reference.tools.compiler.msvc.64