C/C++ Programming - About Library
About Library
大きく分けて2つ 1. 動的なライブラリを作成、利用してみます。 2. 静的なライブラリを作成、利用してみます。 - 簡単なコンソールプログラムを作成します。
動的なライブラリについて
main.c, hoge.cというファイルを使います。 コードを記述 以下はソース(例)です。手持ちのPCでお試しください。
※検証用で... 上が hoge.c ライブラリ(静的、動的) 下が main.c メインエントリ部分
メイク
次にメイクします。 大きく分けて3つの処理があります。
1. hoge.cファイルをオブジェクトファイルに変換(コンパイル)
cc -fPIC -c hoge.c にて -c指定で コンパイル後の オブジェクトファイル生成で処理を停止。 このファイルはこの後 動的なライブラリとして処理します。
2. hoge.oファイルをlibhoge.soへ変換(コンパイル)
cc -shared -o libhoge.so hoge.o
※Memo: libファイル名.soとする決まり
3. main.cファイルを実行ファイルへ変換する(コンパイル+リンク=メイク)
cc -L. -lhoge main.c -o main -L. は カレントディレクトリ内に libhoge.soが存在することを知らせます。 -lhoge は 上記説明にあるように getMessageを保持している ライブラリ名を知らせます。 -llibhoge.soでなく -lhoge とします
1-3を実行後、実行可能形式の
mainファイルが出来上がります。
Memo Linuxで実行可能
実行例
次、mainファイルを実行させてみます。 通常 そのまま ./main を実行しても 動作しないと思います。 下イメージのように libhoge.so が存在しない 旨のメッセージが表示されます。
対応方法は
実行時の ライブラリパスを設定するです
ライブラリパス未調整の場合 以下のlddコマンドの結果のように libhoge.so が not found になっていることが確認できます。 LD_LIBRARY_PATHに libhoge.so の所在を指定します。 今回の例の場合 LD_LIBRARY_PATH=/wrk となります ライブラリパス調整後 not foundが解消されます
Retry
無事動作したようです。
続きまして...
libhoge.soのみを再作成して 再度mainを実行してみます。 ソース変更箇所 #####を追加 hoge.o, libhoge.soのみ再変換後 mainを実行した結果 ※Memo: fileコマンドでファイルの情報を参照可能 出力の最後の方に not stripped とありますが stripeコマンド 対象ファイル名を実行することで 通常運用には影響しない情報を削ってくれ サイズが小さくなります。
Memo
他OSでも同様な結果になると思います。 以下は FreeBSD 10.0-RELEASEで試した結果です gcc から clang(開発元Apple) に変更されています Mac OS Xでもいろいろ試してみたい...