プロジェクト

全般

プロフィール

A/I #6

未完了

Boost.Multiprecisionを使ってみる

開発 次郎 さんが8ヶ月前に追加. 7ヶ月前に更新.

ステータス:
休止中
優先度:
通常
担当者:
開始日:
2025/04/13
期日:
予定工数:

説明

まとめ

MSYS2

  • 環境
    • GCC14とGCC4の両方を使用
      • 正式GCC 4.8.5パッケージは無い。SOURCEOFRGEには有志のビルドがある
  • お試し結果
    • 最新GCC 14.2.0でもGCC4.8.5でもだとboost-1_53_0がビルドできない
      • MSYS環境がサポートされていない
    • boostのリリースノートには1_60_0からMinGW GCCに対応した旨書かれているが、実際は1_60_0をGCCでビルドできず
    • boost_1_66_0はビルド及び使用可能
  • 感想
    • MinGWを使う場合、1_53_0はビルドできない
    • MinGWを使う場合、古くても1_66_0からになる

WSL+CentOS7

  • 環境
    • ネイティブなGCCが4.8.5
    • クロスコンパイラGCC 4.8.5のビルド可能
    • mingw-builds使用
  • お試し結果
    • boost-1_53_0ビルド可能
      • user-config.jamでクロスコンパイラ指定
    • サンプルプログラムは未
  • 感想
    • ターゲット環境のCentOS7と同等なのでLinux向けにはいい
    • デバッグはネイティブでやることになるのかな
    • 本当にWindows版バイナリが作成できているのかな?最初に起動に時間がかかったのが気になる

開発 次郎 さんが8ヶ月前に更新 · 編集済み

セットアップ・メモ

  • ライブラリをインストール
    • pacman -S mingw-w64-ucrt-x86_64-boost
  • C++14から
    • #warning "The minimum language standard to use Boost.Math will be C++14 starting in July 2023 (Boost 1.82 release)" インストール・ログ
  • 参考
    • 最新バージョンを確認する
      • pacman -Ss boost

開発 次郎 さんが7ヶ月前に更新 · 編集済み

Boost 1.53.0 セットアップメモ

最新の1.88.0はMinGW64でビルドしている

  • MinGW64でもMinGWでも同じエラーでビルドできない
    • エラー内容 bootstrap.log
  • MinGW(32ビット環境でありMinGW64とは別)
    • bootstrap.BATファイルがあるのでコマンドプロンプトで実行してみたが失敗
      • エラー内容
  • ライブラリが足りない?
    • Boostをビルドするには次のパッケージが必要?zlibとbzip2はいいが、MinGWにはPythonがない
      • python-devel
      • zlib-devel
      • bzip2-devel
  • Python 2.7(当時はこれだろう)をソースからビルドしてみたが、ビルドできず
    • エラー内容

Boost 1.88(最新)ビルドメモ

  • MinGW64はビルドできなかった?
    • 原因と結果はよくわからない
    • b2コマンドのインストール時、MSYS2環境であるにもかかわらずパス区切り文字がおかしい。/ではなく¥になっている。そのため、/usr/local/ではなく、D:\usr\local下にインストールされた。

MSYS2環境

$ pacman -Qe
base 2022.06-1
base-devel 2024.11-1
cmake 4.0.0-1
filesystem 2025.02.23-1
git 2.49.0-1
mingw-w64-ucrt-x86_64-boost 1.88.0-1
mingw-w64-ucrt-x86_64-gcc 14.2.0-3
mingw-w64-ucrt-x86_64-gdb 16.2-1
mingw-w64-ucrt-x86_64-gdb-multiarch 16.2-1
mingw-w64-ucrt-x86_64-libmangle-git 12.0.0.r657.g1e8b1ccdd-1
mingw-w64-ucrt-x86_64-make 4.4.1-3
mingw-w64-ucrt-x86_64-pkgconf 1~2.3.0-1
mingw-w64-ucrt-x86_64-tools-git 12.0.0.r657.g1e8b1ccdd-1
mingw-w64-ucrt-x86_64-winstorecompat-git 12.0.0.r657.g1e8b1ccdd-1
mingw-w64-x86_64-binutils 2.44-1
mingw-w64-x86_64-cmake 4.0.0-1
mingw-w64-x86_64-crt-git 12.0.0.r657.g1e8b1ccdd-1
mingw-w64-x86_64-gcc 14.2.0-3
mingw-w64-x86_64-gdb 16.2-1
mingw-w64-x86_64-gdb-multiarch 16.2-1
mingw-w64-x86_64-glib2 2.84.1-2
mingw-w64-x86_64-gmp 6.3.0-2
mingw-w64-x86_64-headers-git 12.0.0.r657.g1e8b1ccdd-1
mingw-w64-x86_64-libmangle-git 12.0.0.r657.g1e8b1ccdd-1
mingw-w64-x86_64-make 4.4.1-3
mingw-w64-x86_64-pkgconf 1~2.3.0-1
mingw-w64-x86_64-tools-git 12.0.0.r657.g1e8b1ccdd-1
mingw-w64-x86_64-winpthreads-git 12.0.0.r657.g1e8b1ccdd-1
mingw-w64-x86_64-winstorecompat-git 12.0.0.r657.g1e8b1ccdd-1
msys2-runtime 3.6.1-3
ninja 1.12.1-2
vim 9.1.1006-2

開発 次郎 さんが7ヶ月前に更新 · 編集済み

MSYS1ではb2を作成できたが・・・

MSYS 1.0下でなら、b2コマンドを作成できた。
ポイントは、bootstrap.sh --with-toolset=mingwオプションを付けること。

  • bootstrap.shはMinGWオプションを指定するといい?
    • > $ ./bootstrap.sh --with-toolset=mingw
      • (参考)https://groups.google.com/g/boost-developers-archive/c/vqK2MXdmUZ0/m/qBmI8PRgzAYJ
    • MSYS 1.0ではb2コマンドが作成できた

しかし、そのあとのb2コマンドは失敗する

$ ./b2 install link=static threading=multi cxxflags=-fPIC
mingw.jam: No such file or directory
D:/MinGW/msys/1.0/home/Tatsuo/boost_1_53_0/tools/build/v2/build\toolset.jam:39: in toolset.using
rule mingw.init unknown in module toolset
D:/MinGW/msys/1.0/home/Tatsuo/boost_1_53_0/tools/build/v2/build\project.jam:898: in using
project-config.jam:12: in modules.load
D:/MinGW/msys/1.0/home/Tatsuo/boost_1_53_0/tools/build/v2\build-system.jam:257: in load-config
D:/MinGW/msys/1.0/home/Tatsuo/boost_1_53_0/tools/build/v2\build-system.jam:423: in load-configuration-files
D:/MinGW/msys/1.0/home/Tatsuo/boost_1_53_0/tools/build/v2\build-system.jam:555: in load
D:\MinGW\msys\1.0\home\Tatsuo\boost_1_53_0\tools\build\v2/kernel\modules.jam:283: in import
D:\MinGW\msys\1.0\home\Tatsuo\boost_1_53_0\tools\build\v2/kernel/bootstrap.jam:142: in boost-build
D:\MinGW\msys\1.0\home\Tatsuo\boost_1_53_0\boost-build.jam:17: in module scope

MSYS2では--with-toolset=mingwを付けても失敗する エラーログ

開発 次郎 さんが7ヶ月前に更新 · 編集済み

MSYS2のgcc(≠MinGW GCC)だとビルドできる?

ターミナルはUCRT64とかMinGW64ではなく、MSYSを使う。

$ pacman -S msys/gcc
MSYSとMinGWの違い

開発 次郎 さんが7ヶ月前に更新 · 編集済み

いろいろダメだった。

WSLにCentOS 7を追加してBoost 1.53がビルドできるか試してみる

  • https://qiita.com/hyzhiro/items/d8c287b2ec3b608eefe7
    • https://github.com/mishamosher/CentOS-WSL
    • yum updateでエラー。いつものやつ?
      • エラー内容
  • 開発用ユーザ追加
  • 変更直後はrootのまま。develをログインユーザにするには仮想マシンリブート
  • MinGW-w64 ビルド方法
  • mingw-w64-v4.0.6.tar.bz2
  • binutils-2.24.tar.bz2

開発 次郎 さんが7ヶ月前に更新

ヒントか?

これは何を説明しているんだ?

https://github.com/niXman/mingw-builds/blob/develop/README.md

開発 次郎 さんが7ヶ月前に更新 · 編集済み

Zeranoeさんのmingw-w64-buildをやってみる

https://blog.csdn.net/lengyue2015/article/details/144449310

WSL+CentOS7環境
できたのかな?
少なくともhello.cはビルドしてWindows下で実行できた。

  • WSL下で実行できるのは気にしなくていい?
  • Windows下で実行した際、最初の1回目はずいぶん時間がかかった。
  • Ubuntuでは失敗する。不思議

手順

  1. yum install flex
  2. yum install bison
  3. yum install texinfo
  4. git clone https://github.com/Zeranoe/mingw-w64-build.git
  5. cd mingw-w64-build/
  6. vi mingw-w64-build
    • 41: MINGW_W64_BRANCH="v4.x"
    • 42: BINUTILS_BRANCH="binutils-2_25"
    • 43: GCC_BRANCH="releases/gcc-4.8.5"
  7. ./mingw-w64-build x86_64
    • ~/.zeranoe/mingw-w64/x86_64/に一式が出来上がっている

開発 次郎 さんが7ヶ月前に更新 · 編集済み

x86_64-w64-mingw32-g++でboost-1_53_0をビルドする

  • 前提
    • WSL+CentOS7
      • ネイティブもGCC4.5.8だけどWindows版のバイナリを作りたいのでクロスコンパイラを作成した
    • x86_64-w64-mingw32-g++(GCC4.8.5クロスコンパイラ作成済み)は~/.zeranoe下にインストール済み。
  • 手順
    1. wget https://sourceforge.net/projects/boost/files/boost/1.53.0/boost_1_53_0.tar.bz2
    2. tar xf boost_1_53_0.tar.bz2
    3. cd boost_1_53_0
    4. ./bootstrap.sh
    5. sudo yum install libicu libicu-devel python3 python3-devel
    6. vi user-config.jam
    7. ./b2 toolset=gcc \
      --build-dir=build \
      --prefix=/opt/boost-1.53.0 \
      --user-config=user-config.jam \
      stage
    8. ./b2 toolset=gcc \
      --build-dir=build \
      --prefix=/opt/boost-1.53.0 \
      --user-config=user-config.jam \
      install

開発 次郎 さんが7ヶ月前に更新 · 編集済み

MinGWに関する情報(SOURCEFORGE)

  • MinGWの公式サイト(のsourceforge)で配布されているGCCは、2013年に公開された4.8.1で更新が止まっている。
  • 最新バージョンはMinGW-w64(のsourceforge)からダウンロードできる
    • 64bit版だけでなく、32bit版も配布している。例えば4.8.5が欲しい時は次のように辿っていくとよい
      • Toolchains targetting Win32 / Personal Builds / mingw-builds / 4.8.5 / threads-win32 / dwarf
  • MinGWの公式サイトで配布されていたものもwin32-dwarf版
    • ダウンロードが終わったら7zを解凍できるツールで解凍してパスを通す
  • ちなみにGCC単体でよければtdm-gccというものもある
    • しかしながらGCC単体だとうまく動かないケースがほとんどだと思われる

開発 次郎 さんが7ヶ月前に更新 · 編集済み

ちょいメモ

SOURCEFORGEのGCC4.8.5には、seh版とsjlj版がある。
これらの違いはなんだ?

Scenery and Fish さん

SEH は Strucutured Exception Handlingの略で、Windowsの持つ構造化例外処理実装

SJLJ は SetJump/LongJumpの略で、昔から良く使われてる Cのsetjump/longjumpを使った例外処理実装

gcc使ってるとどれにしたらよいか迷う事があったので調べたら、ここにまとまってた。

http://stackoverflow.com/questions/15670169/what-is-difference-between-sjlj-vs-dwarf-vs-seh

dwarf-2は 32bitでしか動かないのでとりあえず無視。

@spiegel-im-spiegel さん

gcc のスレッドモデルと例外処理
mingw32 または mingw64 で提供される gcc では,スレッドモデルと例外処理は以下のようになっているらしい。
(「 MSYS2 / Tickets / #24 Mingw64 downloads through msys2? 」より)

On MSYS2 I maintain only one configuration:
32-bit: threads=posix, exceptions=dwarf
64-bit: threads=posix, exceptions=seh

MSYS2 のベースになっている MinGW-w64 のスレッドモデルには win32 と posix が提供されている。 win32 は Windows ネイティブなスレッド関連関数を使っているため速いが, C++11 の thread, mutex, future はサポートしていないらしい。

例外処理には SJLJ(SetJump/LongJump), DWARF2, SEH(Structured Exception Handling)があり,この中では Windows ネイティブな SEH が一番速い。ただし SEH は 64bit gcc でしか対応していないため 32bit 環境では使えない。

MinGW-w64 ではインストール時にスレッドモデルと例外処理を選択できる。

MinGW-w64 のもうひとつの実装である TDM-GCC では,スレッドモデルには posix,例外処理には SJLJ(32bit)または SEH(64bit)が設定されているようだ。
(“TDM-GCC : Quirks” より)

開発 次郎 さんが7ヶ月前に更新

開発 次郎 さんが7ヶ月前に更新

開発 次郎 さんが7ヶ月前に更新 · 編集済み

x86_64-4.8.5-release-win32-sjlj-rt_v4-rev0.7z でboostビルドまでトライしてみる

結論

b2.exeがビルドできない。
boostのソースがMinGWを認識していない模様
boost_1_88_0は認識してくれる

経緯

  1. x86_64-4.8.5-release-win32-sjlj-rt_v4-rev0.7z を解凍して、オリジナルの/mingw64 を解凍してできた mingw64/に置き換える
    • MSYS MingWターミナルでバージョンを確認する
      • $ gcc --version
  2. pacman -S python3
    • user-config.jamでpythonを指定するため
    • ここで使うuser-config.jamはWSL+CentOS7でboost-1_53_0のビルドに成功したものを流用する
    • bootstrap.shで失敗する。MSYS2にはない<sys/types.h>を求める。
      • GCC14でも、GCC4でも同様

開発 次郎 さんが7ヶ月前に更新 · 編集済み

boostがMSYS2を認識してくれたのがいつか?ビルドして試してみる

まずはGCC14で。

$ ./bootstrap.sh
$ ./b2 --build-dir=build --prefix=/opt/boost-1.81.0 -link=static threading=multi cxxflags=-fPIC stage

  • boost_1_81_0
    • failed updating 112 targets...
    • skipped 40 targets...
    • updated 3088 targets...
  • boost_1_79_0
    • failed updating 112 targets...
    • skipped 40 targets...
    • updated 3039 targets...
  • boost_1_69_0
    • failed updating 110 targets...
    • skipped 18 targets...
    • updated 2442 targets...
  • boost_1_68_0
    • bootstrap.sh OK
  • boost_1_67_0
    • bootstrap.sh OK
  • boost_1_66_0
    • もっとも古いバージョンでbootstrap.shできる版
    • failed updating 110 targets...
    • skipped 18 targets...
    • updated 2376 targets...
  • boost_1_65_0
  • boost_1_59_0同様。失敗
  • boost_1_64_0
  • boost_1_59_0同様。失敗
  • boost_1_63_0
  • boost_1_59_0同様。失敗
  • boost_1_62_0
  • boost_1_59_0同様。失敗
  • boost_1_61_0
  • boost_1_59_0同様。失敗
  • boost_1_60_0
  • boost_1_59_0同様。失敗
  • boost_1_59_0 ← おそらく1_5x → 1_6xの間でMSYS2が認識された模様
    • 失敗

boost_1_60_0からWindows GCC対応

1_60_0のRelease Noteには次のようにWindowsのGCCが列挙されているが、1_59_0には無い。 ただし、1_60_0はGCC14でビルドできない

Linux:
Clang: 3.4, 3.6
Clang, C++14: 3.7
GCC: 4.4.7, 4.8.4, 4.9.3, 5.1.0, 5.2.1
GCC, C++11: 4.4.7
GCC, C++14: 4.9.3
Windows:
GCC, C++03, mingw: 3.4.5
GCC, C++11, mingw: 4.6.4, 4.7.3, 4.8.1
GCC, C++14, mingw: 4.9.3, 5.1.0
Visual C++: 7.1, 8.0, 9.0, 10.0, 11.0, 12.0, 14.0
Android:
Clang: 3.6, 3.7
GCC: 4.9.0, 5.2.0
QNX:
QCC: 4.4.2
SunOS:
Oracle Solaris Studio: 12.4, 12.5

開発 次郎 さんが7ヶ月前に更新 · 編集済み

boost_1_66_0をGCC4でビルドしてみる

  1. MinGWターミナルでbootstrap.sh(GCC14が使われる)
  2. ./b2 --build-dir=build --prefix=/opt/boost-1.66.0 -link=static threading=multi cxxflags=-fPIC stage
    • user-config.jam
    • b2結果
      • failed updating 108 targets...
      • skipped 12 targets...
      • updated 1931 targets...

開発 次郎 さんが7ヶ月前に更新

  • トラッカーバグ から A/I に変更

開発 次郎 さんが7ヶ月前に更新

  • 説明 を更新 (差分)
  • ステータス新規 から 休止中 に変更

他の形式にエクスポート: Atom PDF