Return to Tech/cpluplu

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でもいろいろ試してみたい...

Return to Tech/cpluplu