戻る

野良ライブラリのビルドと導入

May 21, 2020

野良ライブラリのビルド方法について説明する. ライブラリのコンパイルの方法は普通の実行プログラムとは違う. その次に野良ライブラリをどのように導入するのかを説明する. 基本的にMac向けに解説する.

ライブラリのビルド

静的ライブラリのビルド

実はMacではできないという話がある. Macでは静的実行可能ファイルは存在しないという. システムのライブラリと動的リンクしなくてはならない. よく使うライブラリの再配布は非効率であるため静的リンクが可能なものも使わず基本的に動的リンク, ロードする.

共有ライブラリのビルド

C/C++のビルドの仕組みとライブラリ の説明がわかりやすい.

一般に共有ライブラリ(動的ライブラリ)と言うものはさらに二つの種類に別れ, 動的リンクライブラリと動的ロードライブラリだ. ファイル形式があるシステムではこの二つが同じなためそれを一緒くたにしている.

Macの実行ファイルのフォーマットについてまず知る必要がある. windowsならexeで, linuxならelfと言うがMacではMach-Oと言う. Macでは動的リンクと動的ロードが厳密に区別される. 動的リンクライブラリは.dylibが拡張子で-lfooなどでlibfoo.dylibをリンクできる. 動的ロードライブラリはバンドルと呼ばれ.bundleと言う拡張子が推奨されているが互換性のため.soを使うことも多い.

動的リンクが我々のよく言う動的ライブラリだが, 動的ロードの方がもっと動的で実行時に関数をロードする. よってロードする関数を全く実装していなくてもロードする側はコンパイルできるので, プラグインとして開発ができたりする.

自作のサウンドライブラリmysound.cを作ったとする. これをコンパイルするには, 次のようにする. -dynamiclibオプションをつけること, 接頭辞としてlibをつける, 拡張子をdylibにすると言う3点さえ覚えればいい.


gcc -dynamiclib -o libmysound.dylib mysound.c

Windowsでは次のようにする. オブジェクトファイルを生成してから, -sharedフラグをつけ拡張子をdllにする.


gcc -c mysound.c
gcc -shared -o mysound.dll mysound.o

インクルードする

C/C++のコンパイルについてメモhttp://www.ysr.net.it-chiba.ac.jp/data/cc.html, Linux C/C++ 自作ライブラリ作成環境の構築 が参考になる.

自作ライブラリは/usr/libや/usr/local/libなどシステム標準のディレクトリに直接入れたくはない. ~/include や~/lib ディレクトリを作ってそこに別のディレクトリからシンボリックリンクを張るかコピーする方法がいいだろう.


ln -sf mysound.h $HOME/include
ln -sf mysound.dylib $HOME/lib

ソースファイルでインクルードするファイルをすでに指定しているのでコマンドでインクルードするライブラリを指定する必要はない, 代わりにオプションで指定するかインクルードパスを環境変数で通す必要がある.

オプションの方法について, ヘッダファイルを~/includeに入れた場合.


gcc -c -I$HOME/include main.c

環境変数を使う方法について, 同様にヘッダファイルを~/includeに入れた場合. まず.bashrcや.zshrcなどにCPATHの設定をする.


export CPATH=$CPATH:$HOME/include

これでオプションにパスを渡さなくてもインクルードできる.


gcc -c main.c

リンクする

ライブラリをインクルードしていても, -lmysoundオプションをつけてリンクするライブラリを明示しなくてはならない. -libmysoundでも良かった気がするが, -lの方が入力も楽なのでこっちを使う. libmysound.dylibを見つられるようライブラリパスをオプションで指定するか環境変数で通す必要がある.

オプションを使う方法について, -Lパス というオプションを使う. -lmysoundはlibmysound.dylibの接頭辞libをlに省略してもリンクできるのと拡張子は要らない. -libsound.dylibでもリンクできた気がする.


gcc -o main -L$HOME/lib -lmysound main.o

環境変数でリンクパスを通す方法. .bashrcや.zhsrcなどにLIBRARY_PATHの設定をする.


export LIBRARY=$LIBRARY:$HOME/lib

オプションにパスを渡さなくてもリンクできる.


gcc -o main -lmysound main.o

説明のためにコンパイルとリンクを別の手順として分けたがもちろん一気にやることもできる. 前者の場合.


gcc -o main -I~/include -L~/lib -lmysound main.c

後者の場合


gcc -o main -lmysound main.c

ロードする

リンクしただけでは実はまだ使えず, 実行時にロードできるようにする必要がある. LD_LIBRARY_PATHを使ってロードするライブラリのパスを追加する. 二度手間に思えるかもしれないが, リンクした後にずっとライブラリがその場所に置かれていないといけないというのは不都合が生じることが多い.


export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/lib

動的ロードのDYLD_LIBRARY_PATHと紛らわしい.

環境変数については 環境変数の設定 が参考になる.

math.hについて

math.hをインクルードしたときは-lmオプションをつける必要がある, と言うことだったがMacでは要らないと言う. C言語 math.hをコンパイルする時に-lmが必要ないとき が参考になる.