Mac にて gcc を使って動的共有ライブラリを作る

下記を参考にした。

Mac OSXでダイナミックライブラリdylibを作ったり使ったりする方法

gccC言語コンパイラーです。

wikipedia: GNU C Compiler

この記事では下記の "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) を生成するオプション。

wikipedia: 位置独立コード

(2) オブジェクトファイルから共有ライブラリを作る。

% gcc -shared hello.o - o libhello.dylib

dylib は Mac の共有ライブラリの拡張子

DYLIBファイルとは何ですか

(3) 共有ライブラリをリンクして実行ファイルを作る。

% gcc main.c -lhello -o hello

(4)作成された共有ライブラリと実行ファイルを確認する。

下記を参考にした。

qiita: macOSのコマンドラインアプリでdylibをよろしく扱う方法

otoolでバイナリの内容をいろいろと調べる方法

(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 の 動的リンカー

Apple dyld

(5) 動的共有ライブラリの配置場所

動的共有ライブラリはその性格上、実行ファイルとの位置関係が変わると、ロードできなくなる。

下記のようなメッセージが出る。

% ./hello

dyld: Library not loaded: libhello.dylib Referenced from: hello Reason: image not found

対応策として、共有ライブラリの標準的な置き場である /user/local/lib/ に配置する。

Macで共有ライブラリ(.dylibファイル)の検索パスを追加する

dylib覚え書き

サンプルコードを Github に公開した。 https://github.com/ohwada/MAC_cpp_Samples/tree/master/make/dynamic_lib