【Linux入門】Linuxにおけるライブラリについての解説

概要

 Linuxにおけるライブラリは、共有ライブラリ(Dynamic Link Library、拡張子が*.so)や静的ライブラリ(Static Library、拡張子が*.a)として提供され、プログラムが必要な機能やリソースを提供します。これらのライブラリは、システム全体やアプリケーション単位で使用され、コードの再利用性や実行可能ファイルの効率的な管理を可能にします。

各OSのライブラリ拡張子

静的リンク動的リンク動的ロード
Linux系*.a*.so*.so
macOS*.a*.dylib*.bundle or *.so
Windows系*.lib*.dll*.dll
各OSのライブラリ拡張子

共有ライブラリ( *.so )

  • 動的リンク: 共有ライブラリは動的にリンクされ、実行時にプログラムに結合されます。これにより、複数のプログラムが同じライブラリの機能を共有できます。
  • 共有リソース: システム全体で利用される共有のリソースや機能を提供する。例えば、libc(C標準ライブラリ)やlibm(数学関数のライブラリ)。
  • 動的な更新: ライブラリがアップデートされた場合、アプリケーションは再コンパイルせずに新しいライブラリの機能を利用できる。

静的ライブラリ( *.a )

  • コンパイル時の結合: 静的ライブラリはコンパイル時にアプリケーションに結合され、実行可能ファイルが生成される。これにより、実行時の動的なリンクは不要。
  • 独立性: アプリケーションに結合された静的ライブラリは、そのアプリケーション専用となり、システム全体で共有されることはない。
  • 最適化: 特定のアプリケーションに最適化されたライブラリが必要な場合、静的リンクを使用して独立したバイナリを生成することができる。

ライブラリのパス

  • システムライブラリパス: '/lib' や '/usr/lib' などのシステム全体で使用される共有ライブラリが格納されているパス。
  • ユーザーライブラリパス: '/usr/local/lib' や '/opt/lib' など、ユーザーが独自に導入した共有ライブラリが格納されているパス。

ライブラリの操作

ライブラリの検索

lddコマンドを使用して実行ファイルが依存しているライブラリを表示。

$ ldd /bin/ls
	linux-vdso.so.1 =>  (0x00007fffc67d6000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fd07de65000)
	libcap.so.2 => /lib64/libcap.so.2 (0x00007fd07dc60000)
	libacl.so.1 => /lib64/libacl.so.1 (0x00007fd07da57000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fd07d689000)
	libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fd07d427000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fd07d223000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fd07e08c000)
	libattr.so.1 => /lib64/libattr.so.1 (0x00007fd07d01e000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd07ce02000)

共有ライブラリのキャッシュ更新

共有ライブラリのキャッシュを更新する際には、ldconfigコマンドを使用。

$ sudo ldconfig

プログラムのコンパイル

 Linuxシステム上でCプログラムをコンパイルする場合、gccコンパイラを使用して共有ライブラリや静的ライブラリを指定します。

# 共有ライブラリを使用する場合
gcc -o my_program my_program.c -lm

# 静的ライブラリを使用する場合
gcc -o my_program my_program.c /path/to/libm.a

まとめ

 Linuxにおけるライブラリは、共有ライブラリと静的ライブラリの2つの主要な形態で提供され、アプリケーション開発やシステムの動作において重要な役割を果たしています。共有ライブラリは動的なリンクを通じして機能を提供し、システム全体で共有され、動的な更新が可能です。一方、静的ライブラリはコンパイル時にアプリケーションに結合され、実行可能ファイルが生成されるため、特定のアプリケーションに紐づいた形で提供されます。

 ライブラリの選択や使用は、開発者がアプリケーションの要件に応じて行うべきであり、これにより効率的でメンテナンス性の高いプログラムが実現されます。共有ライブラリと静的ライブラリを上手に活用することで、コードの再利用、実行可能ファイルのサイズの最適化、システム全体の一貫性などが実現され、Linuxプログラム開発において欠かせない要素となっています。