Linuxにおける動的ライブラリの利用と静的・動的リンクの動作確認

動的ライブラリの活用とリンク動作の検証

前回作成した動的ライブラリlibmymath.soを用いて、アプリケーションにリンクさせる方法を再確認します。

一般的なコンパイルコマンド:

gcc main.c -L. -lmymath
  • -L.:カレントディレクトリに存在するライブラリを参照
  • -lmymath:自作ライブラリlibmymath.soを使用することを指定

生成されたa.outlddで確認すると、標準ライブラリ/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

動的ライブラリの実行時リンク問題

動的リンクされたアプリケーションは、実行時にもライブラリパスを解決する必要があります。

以下の方法で実行時のライブラリパスを設定できます:

  1. システムディレクトリへのインストール
    sudo cp libmymath.so /usr/lib64/
    sudo ldconfig
  2. 環境変数LD_LIBRARY_PATHの設定
    export LD_LIBRARY_PATH=$(pwd)/lib:$LD_LIBRARY_PATH
  3. シンボリックリンクの作成
    sudo ln -s $(pwd)/lib/libmymath.so /usr/lib64/libmymath.so
  4. システム設定ファイルの更新
    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

重要な結論

  1. 動的・静的ライブラリが共存する場合、GCCはデフォルトで動的リンクを選択
  2. 静的リンクを強制するには-staticオプションが必要
  3. 静的ライブラリのみ提供された場合、必然的に静的リンクが行われる
  4. 動的ライブラリのみ提供された場合、-staticオプションで静的リンクを試みるとエラーになる

タグ: linux GCC 動的リンク 静的リンク Makefile

5月23日 09:59 投稿