初めての投稿です.
markdownもあまり触ったことはなく,至らぬところあるとは思いますがよろしくお願いします.
私のプログラミング歴は,python歴2年,c++歴2週間です.
以下にいろいろまとめてます(書き方は合っているでしょうか...)
macOS:catalina
c++: clang(11.0.0)
python: 3.7.3
ctypes: 1.1.0
それでは本題に入ります.
ctypesを利用してc++の関数を呼び出したい
プログラムを以下の通り作ってみました.
まずはc++でhello.cpp
を書きました.
c++
1#include <iostream> 2using namespace ::std; 3void hello(){ 4 cout << "Hello" << endl; 5} 6int main(){ 7 hello(); 8}
これをmacのダイナミックライブラリ.dylib
として以下の通りコンパイルしました.
sh
1$ clang++ -dynamiclib -o hello.dylib hello.cpp -std=gnu++14 2$ ls 3hello.cpp hello.dylib
コンパイル自体は問題ないので,pythonでとりあえずmain関数を呼び出すコードとしてctypes_test.py
作成しました.
python
1import ctypes 2libc = ctypes.cdll.LoadLibrary("hello.dylib") 3libc.main()
これを実行しました.
sh
1$ python ctypes_test.py 2$ Hello
このようにmain関数は呼び出せますが,次の通りctypes_test.py
を直して,
python
1import ctypes 2import os 3home = os.environ["HOME"] 4os.chdir(home + "/KYTHON/test/ctypes/") 5libc = ctypes.cdll.LoadLibrary("hello.dylib") 6libc.hello()
これをコンパイルすると,
sh
1$ python ctypes_test.py 2$ Traceback (most recent call last): 3 File "ctypes_test.py", line 6, in <module> 4 libc.hello() 5 File "**私のホームディレクトリ**/anaconda3/lib/python3.7/ctypes/__init__.py", line 369, in __getattr__ 6 func = self.__getitem__(name) 7 File "**私のホームディレクトリ**/anaconda3/lib/python3.7/ctypes/__init__.py", line 374, in __getitem__ 8 func = self._FuncPtr((name_or_ordinal, self)) 9AttributeError: dlsym(0x7fc181500f10, hello): symbol not found
となって,hello関数を呼び出せないです.
どうやらctypesがmain関数だけしか認識してくれないようです.
このように,macでのctypesの利用について同じ悩みを抱えている人はいませんか?
または,解決法をご存知の方は教えていたらげると幸いです.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/02 14:12 編集
2019/11/02 15:46