コンテンツにスキップ

Shared Object ファイルを生成する

C 言語で共有ライブラリを作成して、Python から呼び出してみる。

構成

1
2
3
4
5
6
.
├── Makefile
├── obj
├── example.py
└── src
    └── shared.c

ファイル

1
2
3
4
5
#include <stdio.h>

char* hello() {
    return "Hello, World!";
}
1
2
3
4
5
6
7
.PHONY: clean

obj/shared.so: src/shared.c
    gcc -shared -o obj/shared.so -fPIC src/shared.c

clean:
    rm -rf obj/*
1
2
3
4
5
6
7
import ctypes

shared = ctypes.CDLL("./obj/shared.so")
shared.hello.restype = ctypes.c_char_p  # hello関数の戻り値はchar*

ret = shared.hello()
print(ret.decode("utf-8"))    # バイナリを文字列に変換する

gcc のオプションについて

-shared

共有ライブラリを生成する。

-o ${filename}

出力ファイルの名前を指定する。

-fPIC

"Position Independent Code"の略。位置に依存しないコードを生成する。

ライブラリがどのアドレス空間にロードされても動作できることを保証する。

実行結果

1
2
3
$ make
$ python example.py
Hello, World!