先日、Linux環境にてC++で動的ライブラリ作成方法についてまとめました。
ライブラリ化したコードをC++でリンクすれば使用したいコードがすぐに使えるのですが、
使用していてふと、、、
pythonなど他の言語で動的ライブラリを読むことは出来ないのだろうか??🤔
と思い、調べてみました。
今回はPythonで動的ライブラリを読み込んでみたいと思います。
■前提条件
今回使用する関数ですが、単純な足し算を行う、
int add(int,int)関数
と単純な引き算を行う、
int sub(int,int)関数
をライブラリ化して、pythonで読み出して結果を出力してみたいと思います。
また、ライブラリ化した際のライブラリ名を、
libhoge.so
とします。
■C言語で作成した動的ライブラリをPythonで読み込んでみる
まずはC言語で作成した動的ライブラリをPythonで読み込んでみます。
動的ライブラリを読み込むにあたり、
ctypes
というライブラリを用います。
pythonのコードはこちらになります。
import ctypes PATH_TO_LIB = "./libhoge.so" libc = ctypes.CDLL(PATH_TO_LIB) ret = libc.add(1,2) print(ret) ret = libc.sub(3,1) print(ret)
#include <stdio.h> int add(int a, int b){ return a+b; } int sub(int a,int b){ return a-b; }
こちらのhoge.cをコンパイルし、動的ライブラリを作成していきます。
コンパイル手順はこちら。
gcc -shared -fPIC -o libhoge.so hoge.c
実施すると、libhoge.soが生成されるのでさきほど作成したpythonコードと同階層に格納し、
python pythonコード名.py
のように実行すると、
3 2
と出力されるかと思います。
■C++言語で作成した動的ライブラリをPythonで読み込んでみる
次にC++言語で作成した動的ライブラリをPythonで読み込んでみます。
試しに先ほどのコードをcppファイルにして
g++ -shared -fPIC -o libhoge.so hoge.cpp
を実行してみましたが、、、
AttributeError: ./libhoge.so: undefined symbol: add
と出力されてしまい、ライブラリを正確に読み取れていないようです。
調べてみたところ、ctypesはC言語のみ対応しておりC++だと認識しないようです。
このため、
__cplusplusを用いて、C言語として読み込ませる必要があるとのこと。
そこで、
ファイル名:hoge.h
#include <stdio.h> #ifdef __cplusplus extern "C"{ #endif int add(int a, int b); int sub(int a,int b); #ifdef __cplusplus } #endif
を作成し、cppファイルを
#include "hoge.h" int add(int a, int b){ return a+b; } int sub(int a,int b){ return a-b; }
と変更し再度、
g++ -shared -fPIC -o libhoge.so hoge.cpp
を実行しlibhoge.soを生成後、
先ほどのpythonコードを実行したところ、
3 2
を得ることが出来ました。