Windowsでダイナミックリンクライブラリdllを作ったり使ったりする方法。

昨日までのブログに続いて最後にWindowsで動的なライブラリを作成する方法を書きます。
Mac OSXでダイナミックライブラリdylibを作ったり使ったりする方法。
Linuxで共有ライブラリsoを作ったり使ったりする方法。

広告

Windowsの場合はダイナミックリンクライブラリdll

Windowsの場合は、dllという拡張子になります。これは色々なところで見かけるので、開発者でなくても知っていたりしますね。
下記ブログを参考にしました。
Windowsでgcc+SDL -ダイナミックリンクライブラリ作る(DLL)-

ライブラリのコードを書く。

簡単なライブラリコードを書きます。hello関数を実行すると、hello worldを出力するだけです。

#include 
int hello() {
	printf("hello world\n");
	return 0;
}

これを、dylibexample.cと名づけて保存します。

Cygwin上でgccでdllにコンパイルする。

Windowsの場合は、コンパイルする環境を用意するだけでもちょっと面倒です。今回はCygwinを利用することにします。

$ gcc -c dylibexample.c
$ ls
dylibexample.c  dylibexample.o

コンパイルしたものを、-sharedオプションをつけてdllに変換します。

$ gcc -shared -o dylibexample.dll dylibexample.o
$ ls
dylibexample.c  dylibexample.dll  dylibexample.o

main関数からライブラリを使う。

今度はライブラリを使う側の本体の処理を書きます。メイン関数の中に、ライブラリのhello関数を呼ぶ処理を書くだけとします。

int main(){
	return hello();
}

これをコンパイルするときに、ダイナミックリンクライブラリdylibexample.dllをリンクします。

$ gcc -I./ -L./ -o main.exe main.c -ldylibexample
$ ls
dylibexample.c  dylibexample.dll  dylibexample.o  main.c  main.exe

実行ファイルができました!

$ ./main.exe
hello world

Cygwin上で実行できます!

Cygwinから独立して実行できるようにする。

こうして作成したexeをCygwinからではなく、Windowsのコマンドプロンプトから実行すると、エラーが出てしまいます。
スクリーンショット 2013-10-24 11.02.51
Cygwinのgccでコンパイルすると、cygwin1.dllに依存する形になってしまうんですね。
この問題は、MinGWをコンパイラとして利用することで解決できます。

$ i686-w64-mingw32-gcc -c dylibexample.c
$ i686-w64-mingw32-gcc -shared -o dylibexample.dll dylibexample.o
$ i686-w64-mingw32-gcc -I./ -L./ -o main.exe main.c -ldylibexample

こうして作成されたexeはCygwinから離れてコマンドプロンプトからも実行できます!

各プラットフォームの動的ライブラリを作るシリーズ

Mac OSXの場合: Mac OSXでダイナミックライブラリdylibを作ったり使ったりする方法。
Linuxの場合: Linuxで共有ライブラリsoを作ったり使ったりする方法。
Visual Studioの場合: Visual Studioでダイナミックリンクライブラリdllを作ったり使ったりする方法。

コメント

  1. […] Windowsでダイナミックリンクライブラリdllを作ったり使ったりする方法。 […]

  2. […] Previous: Windowsでダイナミックリンクライブラリdllを作ったり使ったりする方法。 Next: Linuxで共有ライブラリsoを作ったり使ったりする方法。 […]

  3. […] 4回目のブログですが、「Windowsでダイナミックリンクライブラリdllを作ったり使ったりする方法。」に続いて、CygwinではなくVisual Studioを使ってdllを作成する方法を書きます。 […]

  4. […] […]

  5. […] り使ったりする方法 ▼ http://blog.katty.in/4350 […]

タイトルとURLをコピーしました