ここでは動的ライブラリとそれを利用する実行ファイルの作り方について説明します。
以下の手順に従ってサンプルの作成例が以下の記事になります。
https://qiita.com/miyo4/items/1211b88083f7af261855
動的ライブラリの作成
コンパイル
gcc -fPIC -c <ソース(.c)>
or
gcc -fPIC -c <ソース(.c)> -I <ヘッダファイルのディレクトリパス>
・-fPIC
の指定は必須
・ソースファイル名.o
のファイル名でオブジェクトファイルが生成される
・/usr/include
以外にあるヘッダを参照する場合は-I
でディレクトリを指定する
動的ライブラリ作成(リンク)
gcc -shared -o <ライブラリ名(lib**.so)> <オブジェクトファイル(.o)>
・オブジェクトファイル(.o) はコンパイルにより生成される
・動的ライブラリのファイル名はlib<ライブラリ名>.so
と決まっている
・他に静的ライブラリのファイル名はlib<ライブラリ名>.a
などがあるがここでは使わない
動的ライブラリを利用する実行ファイルの作成
コンパイル
gcc -c <ソース(.c)>
or
gcc -c <ソース(.c)> -I <ヘッダファイルのディレクトリパス>
・/usr/include
以外にあるヘッダを参照する場合は-I
でディレクトリを指定する
実行ファイル作成(リンク)
gcc -o <実行ファイル名> <オブジェクトファイル名(.o)>
or
gcc -o <実行ファイル名> <オブジェクトファイル名(.o)> -l <動的ライブラリ名の**部分(lib**.so)>
or
gcc -o <実行ファイル名> <オブジェクトファイル名(.o)> -L <動的ライブラリのディレクトリパス> -l <動的ライブラリ名の**部分(lib**.so)>
・実行ファイルが動的ライブラリ(lib**.so)を参照する場合は-l
オプションでライブラリ名を指定する。ライブラリ名を指定はlib<ライブラリ名>.so
の<ライブラリ名>
の部分なので間違えないように。
・動的ライブラリが/lib64
フォルダ以外に存在する場合は-L
オプションでディレクトリを指定したうえで、-l
オプションでライブラリ名を指定する
動的ライブラリを使った実行ファイルの実行
共有ライブラリの検索パスを追加する必要がある場合
動的ライブラリが標準の検索パス上に存在しない場合は、実行時にエラーが出力されます。
その場合は、以下2種類の方法で検索パスを追加することができます。
環境変数LD_LIBRARY_PATH
で指定する方法
動的ライブラリを検索するパスを追加したい場合は環境変数LD_LIBRARY_PATHにパスを追加するのがよし。例えば、カレントディレクトリを検索パスに加えたい場合は以下を実行する。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<検索パス>
例えば、カレントディレクトリを追加したい場合は以下となる。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
リンク時に検索パスを-Wl,-rpath=
で指定しておく
実行ファイルを作成する時にリンクオプション-Wl,-rpath=
に検索パスを指定しておくこともできます。この場合は、LD_LIBRARY_PATH
の編集は不要です。
gcc -o <実行ファイル名> <オブジェクトファイル名(.o)> -Wl,-rpath=<検索パス>
例えば、カレントディレクトリを追加したい場合は以下となる。
gcc -o <実行ファイル名> <オブジェクトファイル名(.o)> -Wl,-rpath=.