Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

PythonでC、C++で作成した動的ライブラリを読み込み

先日、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)

C言語で作成したコードはこちら。
ファイル名:hoge.c

#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

を得ることが出来ました。

■最後に

今回はPythonでC、C++で作成した動的ライブラリを読み込んでみました。
今度は別の言語でライブラリ読み込めるのか確認していきたいと思います。