私は、Pythonのctypesを使ってLinux上のIntel Processor Traceライブラリ(libipt)を呼び出す作業をしています。ライブラリ内の初期化関数の1つpt_config_init()は、intel-pt.hヘッダーファイル内の静的インライン関数として定義されています。私はPythonコードからこの関数を呼び出そうとすると、このエラーがスローされます:関数はライブラリにコンパイルではなく、関連するCのヘッダーファイルを含めることによってアクセスされないようPython ctypes - ヘッダファイル内の静的インライン関数を呼び出しますか?
libipt.pt_config_init(byref(config))
File "/usr/lib64/python3.5/ctypes/__init__.py", line 355, in __getattr__
func = self.__getitem__(name)
File "/usr/lib64/python3.5/ctypes/__init__.py", line 360, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /lib64/libipt.so.1.4.0: undefined symbol: pt_config_init
これは、理にかなっていますソース。 ctypesでこのようなインライン関数を呼び出す方法はありますか?そうでない場合、推奨される回避策はありますか?
1.インライン関数の場合は、かなりシンプルになるはずです。単に 'ctypes'に直接書くことができます。 2. "回避策"は、元の関数をエクスポートされた名前にインライン化する "void inlinewrapper(...){return inlinefunc(...);}"などの関数をエクスポートする新しいライブラリを作成することだけです。 – ShadowRanger
@ShadowRanger:内部ライブラリの変数、メソッド、クラスをctypesを使って書く方法はありますか?一般的には不可能です。 – woockashek
@ShadowRanger:わかりやすくするために、私は 'ctypes'の初心者です。上記の出力は、さまざまな\ _fields \ _(サイズ、開始、終了など)を持つctypes.Structureクラスのインスタンスです。 "ctypesで直接書き込む"と言うと、PythonのインスタンスをPythonコードで直接設定することを意味します同じ方法でインライン関数は?(例えば 'config.size = 4') – charon00