下記を参考にした。
Mac OSXでダイナミックライブラリdylibを作ったり使ったりする方法
この記事では下記の "Hello World" を出力する ソースコード hello.c を 共有ライブラリにする。
hello.c
void hello() { printf("Hello World \n"); }
アプリ main.c は、 hello()を呼び出すだけ。
main.c
int main() { hello(); return 0; }
共有ライブラリを作る手順
(1) ソースファイルからオブジェクトファイルを作る。
% gcc -c -fPIC hello.c - o hello.o
fPIC は PIC(位置独立コード Position Independent Code) を生成するオプション。
(2) オブジェクトファイルから共有ライブラリを作る。
% gcc -shared hello.o - o libhello.dylib
dylib は Mac の共有ライブラリの拡張子
(3) 共有ライブラリをリンクして実行ファイルを作る。
% gcc main.c -lhello -o hello
(4)作成された共有ライブラリと実行ファイルを確認する。
下記を参考にした。
qiita: macOSのコマンドラインアプリでdylibをよろしく扱う方法
(4-1) 共有ライブラリの自身のパスを確認する。
% otool -D libhello.dylib
libhello.dylib:libhello.dylib
(4-2) 依存するライブラリのパスを確認する。
% otool -L libhello.dylib
libhello.dylib /usr/lib/libSystem.B.dylib
libSystem.B.dylib は Mac の libc
qiita: OSXの libc は libSystem.B.dylib なのかも
(4-3) 実行ファイルの依存するライブラリを確認する。
% otool -l hello
name /usr/lib/dyld name lib/libhello.dylib name /usr/lib/libSystem.B.dylib
dyld は Mac の 動的リンカー
(5) 動的共有ライブラリの配置場所
動的共有ライブラリはその性格上、実行ファイルとの位置関係が変わると、ロードできなくなる。
下記のようなメッセージが出る。
% ./hello
dyld: Library not loaded: libhello.dylib Referenced from: hello Reason: image not found
対応策として、共有ライブラリの標準的な置き場である /user/local/lib/ に配置する。
Macで共有ライブラリ(.dylibファイル)の検索パスを追加する
サンプルコードを Github に公開した。 https://github.com/ohwada/MAC_cpp_Samples/tree/master/make/dynamic_lib