動的ライブラリの活用とリンク動作の検証
前回作成した動的ライブラリlibmymath.soを用いて、アプリケーションにリンクさせる方法を再確認します。
一般的なコンパイルコマンド:
gcc main.c -L. -lmymath
-L.:カレントディレクトリに存在するライブラリを参照-lmymath:自作ライブラリlibmymath.soを使用することを指定
生成されたa.outをlddで確認すると、標準ライブラリ/lib64/libc.so.6と作成したlibmymath.soが正しくリンクされていることが確認できます。
ライブラリ配布用Makefileの構築
ライブラリ開発者がユーザーに提供すべきもの:
- ヘッダファイル(
.h) - ライブラリファイル(
.soまたは.a)
配布用Makefileの例:
.PHONY: output
output:
mkdir -p ./dist/lib ./dist/include
cp -f libmymath.so ./dist/lib/
cp -f add.h sub.h ./dist/include/
tar -czf mylib.tar.gz -C ./dist .
このMakefileにより、mylib.tar.gzという配布用パッケージが生成されます。
配布パッケージの利用方法
新規ディレクトリにパッケージを展開:
mkdir testdir && mv mylib.tar.gz testdir/ && cd testdir
tar -xzf mylib.tar.gz
アプリケーションmain.cをコンパイル:
gcc -o myapp main.c -I ./include -L ./lib -lmymath
必要に応じて、以下のように簡潔なコマンドでコンパイルすることも可能です:
gcc -o myapp main.c -lmymath
動的ライブラリの実行時リンク問題
動的リンクされたアプリケーションは、実行時にもライブラリパスを解決する必要があります。
以下の方法で実行時のライブラリパスを設定できます:
- システムディレクトリへのインストール:
sudo cp libmymath.so /usr/lib64/ sudo ldconfig - 環境変数
LD_LIBRARY_PATHの設定:export LD_LIBRARY_PATH=$(pwd)/lib:$LD_LIBRARY_PATH - シンボリックリンクの作成:
sudo ln -s $(pwd)/lib/libmymath.so /usr/lib64/libmymath.so - システム設定ファイルの更新:
echo "$(pwd)/lib" | sudo tee /etc/ld.so.conf.d/mylib.conf sudo ldconfig
静的・動的ライブラリの同時提供とリンク挙動
静的ライブラリlibmymath.aと動的ライブラリlibmymath.soを同時に配布した場合の動作:
- 通常のコンパイル:
gcc -o app main.c -L./lib -lmymath→ 動的リンクが選択される - 強制的に静的リンク:
gcc -o app main.c -L./lib -static -lmymath
重要な結論
- 動的・静的ライブラリが共存する場合、GCCはデフォルトで動的リンクを選択
- 静的リンクを強制するには
-staticオプションが必要 - 静的ライブラリのみ提供された場合、必然的に静的リンクが行われる
- 動的ライブラリのみ提供された場合、
-staticオプションで静的リンクを試みるとエラーになる