WindowsプラットフォームMinGW GCCはコンパイルしてC++Boostを使用します.

6326 ワード

WindowsプラットフォームMinGW GCCはコンパイルしてC++Boostを使用します.
記事の目次
  • WindowsプラットフォームMinGW GCCをコンパイルし、C+Boost
  • を使用する.
  • 前提
  • は、動的リンクライブラリ
  • をコンパイルする.
  • コンパイルされたBoostダイナミックリンクライブラリ
  • を使用する.
  • コンパイルしたBoostは静的リンクライブラリ
  • である.
  • Boost静的リンクライブラリを使用する
  • 前提
    オペレーティングシステム:Windows 10は、MinGWをインストールし、gcc.exeなどのプログラムをPath変数に追加します.
    ダウンロードされたBoostディレクトリでbooststrap.batが実行され、このスクリプトは自動的にコンパイルプログラムb 2.exeを生成する.
    Boostを動的リンクライブラリにコンパイルします.
    動的リンクのコンパイルスクリプトは以下の通りです.
    .\b 2.exe stage--toolset=gcc--stagedir=「C:\SDK\bootst_1_69_0\bin\gcc」--link=shared runtime-link=shared threading=multi debug release
    このコマンドは、使用するコンパイルツール(--toolset)がgccであり、生成された静的、動的リンクライブラリディレクトリ(--stageddir)がC:\SDK\book_であることを示している.1_69_0\bin\gcc,Boostライブラリは動的リンク方式(--link=shared)を採用し,C/C++のライブラリも動的リンク方式(--runtime-link=shared)を採用し,マルチスレッドバージョンをコンパイルし(threading=multi),ターゲットがdebugとreleaseモードのライブラリファイルを生成する.
    上記のコンパイルスクリプトを実行します.(10~15分ぐらいかかります.)コンパイルが完了したら、C:\SDK\bootst_1_69_0\bin\gcc\libで作成されたダイナミックリンクライブラリファイル(.dll)とスタティックリンクライブラリファイル(.dll.a)を見ました.ここではbootstのfilesystemライブラリを例にとって、ライブラリファイルの構成について説明します.
    ダイナミックリンクライブラリとしてコンパイルされたBoost Libraryは、4つのファイルとしてコンパイルされ、filesystemライブラリを例にしています.
    libbooost_filesystem-mgw 82-mt-d-x 32-1_69. dll librost_filesystem-mgw 82-mt-d-x 32-1_69. dll.a librost_filesystem-mgw 82-mt-x 32-1_69. dll librost_filesystem-mgw 82-mt-x 32-1_69.dll.a
  • mt:マルチスレッドバージョン
  • を表します.
  • d:debugモードを表し、dがないとreleaseモード
  • を表します.
  • x 32:32ビットバージョンを表します.MinGWの32ビットバージョンしかインストールされていませんので、32ビットバージョンのライブラリファイル
  • のみをコンパイルしました.
  • _69:Boostバージョン番号
  • dll:展開後に使用される動的リンクライブラリファイル
  • .a:リンク時に使用される静的リンクライブラリファイル
  • コンパイルしたBoostダイナミックリンクライブラリを使用します.
    以下では、簡単なプログラムを使用して、Boostの動的リンクライブラリを使用して、このプログラムはBoostのバージョン番号を印刷して、filesystemライブラリを使用して、Boostインストールディレクトリの下のb 2.exeファイルが存在するかどうかを確認します.
    #include 
    #include 
    #include 
    #include 
    
    int main(int argc, char** argv){
        std::cout << BOOST_VERSION << std::endl;
        boost::filesystem::path root("C:\\SDK\\boost_1_69_0\\b2.exe");
        std::cout << boost::filesystem::exists(root) << std::endl;
        return 0;
        
    }
    
    テストプログラムが作成された後、次のステップはターゲットファイルをコンパイルして生成します.MinGWで提供されるmakeツールを使います.mingw 32-make.exeでコンパイルとリンクの仕事を完成します.リンクする時、Boostを使ってreleaseモードで作成されたライブラリをコンパイルします.makeスクリプトは以下の通りです
    TestBoost_dynamic.exe: TestBoost.o copy_dependency
    	g++ TestBoost.o -Wall -LC:\SDK\boost_1_69_0\bin\gcc\lib -lboost_filesystem-mgw82-mt-x32-1_69.dll -o TestBoost_dynamic.exe
    	
    TestBoost.o: TestBoost.cpp
    	g++ -c TestBoost.cpp -IC:\SDK\boost_1_69_0
    	
    copy_dependency: 
    	copy C:\SDK\boost_1_69_0\bin\gcc\lib\libboost_filesystem-mgw82-mt-x32-1_69.dll .\libboost_filesystem-mgw82-mt-x32-1_69.dll
    	
    clean: 
    	del TestBoost.o
    	del TestBoost_dynamic.exe
    	del libboost_filesystem-mgw82-mt-x32-1_69.dll
    
    g++の関連パラメータは以下の通りです.https://www.rapidtables.com/code/linux/gcc.html)
  • -I:プログラム参照のヘッダファイルの所在ディレクトリは、上記のMakefileに示すように、コンパイル時にこのパラメータを使用して、TestBoost.cppファイルをコンパイルしました.ObjファイルTestBoost.o
  • -L:リンクライブラリのディレクトリを検索します.このパラメータは一般的にリンク段階で適用されます.Objファイルと関連するサードパーティライブラリをリンクして、ターゲットファイルTestBoost_を生成します.dynamic.exe
  • -l(小文字のL):リンクすべき静的なライブラリファイルを指定します.私たちのプログラムで使用されているfilesystemライブラリのため、リンク先としてライブラリを指定する必要があります.ここで注意が必要です.ここで-lパラメータに渡されるのは、filesystemの静的なリンクファイル、すなわちlibrost_です.filesystem-mgw 82-mt-x 32-1_69. dll.aファイルでは、gcc規定で-lに渡すパラメータは関連ファイルの前のlib及び後のlibを削除しなければならない.a、中間のファイル名を-lパラメータに渡す.例えば、libmath.aを-lパラメータに渡すと-lmathとなるので、上記Makefileで-lに送るパラメータはlibbook(u)である.filesystem-mgw 82-mt-x 32-1_69.dll~.a~
  • -o:最終出力ファイル
  • を指定しました.
  • -Wall:全アラーム情報を開く
  • このMakefileは以下のコマンドで実行します.
    mingw 32-make.exe-f Makefile_dynamic
    上記のコマンドを実行すると、現在のディレクトリには以下のファイルが含まれています.
    Makefile_dynamic TestBoost.cpp libbooost_filesystem-mgw 82-mt-x 32-1_69. dll TestBoost_dynamic.exe TestBoost.o
    特に説明が必要なのは、ダイナミックリンクの形でBoostライブラリを使用するため、関連する動的リンクライブラリファイル(すなわちlibrostufilesystem-mgw 82-mt-x 32-1_69.dll)を現在のディレクトリにコピーする必要があります.dynamic.exeファイルは実行できません.この時、Boost Text_をダブルクリックします.dynamic.exeの場合、Windowsはエラーを報告し、ダイナミックリンクライブラリファイルが足りないことを提示します.
    また、動的リンクを用いてターゲットファイルを生成することにより、生成されたターゲットファイルTestBoost_を見ることができる.dynamic.exeは387 KBしかありません.関連する依存性はすべてダイナミックリンクライブラリファイルの中にありますので、ターゲットファイルは比較的小さいです.これに比べて、後で紹介した静的リンクを使用して生成されたターゲットファイルTestBoost_.static.exeの体積はTestBoost_より大きくなります.dynamic.exeは、静的リンクを使用して、関連関数が目的ファイル自体にコンパイルされているからです.
    Boost Testを実行しますdynamic.exeは出力結果を得ることができます.
    10699
    スタティックリンクライブラリをコンパイル
    ダイナミックリンクライブラリをベースにコンパイルしました.スタティックリンクライブラリをコンパイルするのは簡単です.b 2.exeを使ってスタティックリンクをコンパイルするスクリプトは以下の通りです.
    .\b 2.exe stage--toolset=gcc--stagedir=「C:\SDK\bootst_1桅0\bin\gccallatatic」--link=static runtime-link=static threading=multi debug rease
    動的リンクライブラリと区別するために、コンパイルされた静的リンクライブラリをC:\SDK\bootst_に保存します.1_69_0\bin\gcc_all_staticディレクトリの下です.ダイナミックリンクライブラリとは違って、一つのBoost Libraryコンパイルは二つのファイルを得ました.aファイルはfilesystemを例にしています.
    libbooost_filesystem-mgw 82-mt-sd-x 32-1_69.a libbooost_filesystem-mgw 82-mt-s-x 32-1_69.a
    動的リンクの例を組み合わせると、これらの2つのファイルはそれぞれdebugモードであり、releaseモードである静的リンクライブラリファイルであることが分かりやすい.
    ブックスタティックリンクライブラリを使う
    以下でコンパイルしたBoostスタティックライブラリを使用して、テスト手順は上記と同じですが、今回はBoostスタティックライブラリを使ってターゲットファイルTestBoost_を生成します.static.exe、関連Makefileは以下の通りです.
    TestBoost_static.exe: TestBoost.o
    	g++ TestBoost.o -Wall -LC:\SDK\boost_1_69_0\bin\gcc_all_static\lib -lboost_filesystem-mgw82-mt-s-x32-1_69 -o TestBoost_static.exe
    	
    TestBoost.o: TestBoost.cpp
    	g++ -g -c TestBoost.cpp -IC:\SDK\boost_1_69_0
    	
    clean: 
    	del TestBoost.o
    	del TestBoost_static.exe
    
    TestBoost.cppを.objファイルにコンパイルするプロセスは同じです.リンク時に使用する-Lパラメータと-lパラメータは動的リンク時とは異なります.この時-Lパラメータは前にコンパイルしたBoostスタティックリンクライブラリのディレクトリを指定します.-lは使用するスタティックリンクライブラリファイルlibrost(u)を指定します.filesystem-mgw 82-mt-s-x 32-1_69.a、前のlib及び後のaファイルを削除しました.
    このMakefileを実行すると、現在のディレクトリは以下のファイルを生成します.
    Makefile_static TestBoost.cpp TestBoost_static.exe TestBoost.o
    TestBoost.static.exeは、生成されたターゲットファイルであり、スタティックリンク方式を使用しているため、TestBoost_static.exeはもうダイナミックリンクライブラリファイルを必要としなくなりましたので、直接実行できます.出力が得られます.
    10699
    なお、静的リンクを用いて生成されたターゲットファイルのサイズは867 KBであり、動的リンクを用いて生成されたターゲットファイルと比較して、500 KBは十分に大きく、関連する依存性がターゲットファイルの内部にコンパイルされているので、結果として得られたターゲットファイルは比較的大きい.