2016-11-09 12 views
0

私は、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

1.インライン関数の場合は、かなりシンプルになるはずです。単に 'ctypes'に直接書くことができます。 2. "回避策"は、元の関数をエクスポートされた名前にインライン化する "void inlinewrapper(...){return inlinefunc(...);}"などの関数をエクスポートする新しいライブラリを作成することだけです。 – ShadowRanger

+0

@ShadowRanger:内部ライブラリの変数、メソッド、クラスをctypesを使って書く方法はありますか?一般的には不可能です。 – woockashek

+0

@ShadowRanger:わかりやすくするために、私は 'ctypes'の初心者です。上記の出力は、さまざまな\ _fields \ _(サイズ、開始、終了など)を持つctypes.Structureクラスのインスタンスです。 "ctypesで直接書き込む"と言うと、PythonのインスタンスをPythonコードで直接設定することを意味します同じ方法でインライン関数は?(例えば 'config.size = 4') – charon00

答えて

2

いいえ、できません。

この機能はライブラリによってエクスポートされないだけでなく、まったく存在しない可能性があります。

コンパイラがインライン展開の価値があると判断した場合(キーワードは候補のみです) インラインで定義されていないときに通常呼び出されるすべての場所で、関数本体がコピー/ペーストされます。

関連する問題