MinGWによる静的ライブラリの作成と静的リンク

MinGW g++ を使った静的ライブラリの作成方法と静的リンクについて紹介します。静的リンクとは、コンパイル時に実行ファイルとライブラリをリンクすることです。一方、動的リンクとは、実行時に実行ファイルとライブラリをリンクすることです。


静的ライブラリの作成

まず、下記の module1.cpp と module2.cpp を作成します。

module1.cpp


int add(int x, int y) {
  return x + y;
}

module2.cpp


int mul(int x, int y) {
  return x * y;
}

module1.cpp と module2.cpp があるフォルダでバッチファイル archive.bat を実行すると、静的ライブラリ libexample.a が生成されます。その後で、libexample.a をフォルダ C:\lib に移動させています。静的ライブラリは複数のオブジェクトファイルが一つにまとめられたファイルです。

archive.bat


set path=C:\MinGW\bin
g++ -c module1.cpp
g++ -c module2.cpp
ar r libexample.a module1.o module2.o
move libexample.a C:\lib


実行ファイル(EXE)の作成

呼び出す側のプログラム main.cpp を作成します。

main.cpp


#include <iostream>

int add(int, int);
int mul(int, int);

int main() {
  std::cout << add(1, 1) << std::endl;
  std::cout << mul(1, 1) << std::endl;
}

main.cpp があるフォルダでバッチファイル main1.bat~main3.bat を実行すると、実行ファイル main.exe が生成されます。静的リンクではこの段階で、静的ライブラリ libexample.a が実行ファイル main.exe に取り込まれます。

main1.bat のように -static を指定すると静的リンクできる全てのライブラリに対して静的リンクを適用するので、今回の場合 libexample.a だけでなく C/C++ 標準ライブラリも静的にリンクされます。
尚、-L でライブラリのパスを指定し、-l でリンクするライブラリを指定します。コマンドの中にある -lexample は libexample.a のことです。

main1.bat


set path=C:\MinGW\bin
g++ -static main.cpp -LC:\lib -lexample -o main.exe
strip main.exe

ライブラリを個別に静的リンクするには main2.bat のようにします。-dn(dynamic no)は静的リンク、-dy(dynamic yes)は動的リンクを表わします。また、-static-libgcc 及び -static-libstdc++ は、C/C++ 標準ライブラリを静的リンクするために用います。
尚、今回のプログラムの場合、main1.bat と main2.bat が生成するネイティブコードは全く同じです。

main2.bat


set path=C:\MinGW\bin
g++ main.cpp -LC:\lib -Wl,-dn,-lexample -static-libgcc -static-libstdc++ -o main.exe
strip main.exe

main3.bat の場合、libexample.a は静的リンク、C/C++ 標準ライブラリは動的リンクです。このため、実行時に libgcc_s_dw2-1.dll が必要になります。

main3.bat


set path=C:\MinGW\bin
g++ main.cpp -LC:\lib -lexample -o main.exe
strip main.exe


EXEの実行

バッチファイル run.bat を実行して下さい。尚、C:\MinGW\bin にパスを通しているのは、main3.bat で生成した main.exe を実行する際に libgcc_s_dw2-1.dll が必要になるためです。main1.bat と main2.bat で生成した main.exe では必要ありません。

run.bat


set path=C:\MinGW\bin
main.exe
pause


参考サイト

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中