私はC++プログラムを動的ライブラリにコンパイルしました。これをctypes経由でPythonで呼び出しています。しかし、私は次のエラーを取得する:これはC++コード内、または私はctypesのを使用していますどのようにエラーであればデバッグ方法 - PythonのCTypesが* glibcを検出しました*
*** glibc detected *** ../../bin/python: free(): invalid pointer: 0x00007fbdf8ae3500 ***
は、私はどのように把握できますか?
Cプログラムでリンクされている場合、またはスタンドアロンプログラムとしてコンパイルした場合、C++ライブラリではが正常に実行されます。が実行されます。私は次のように周りのものを変更した場合、私はPythonのプログラムが正常に動作するように取得することができ、いくつかの理由
def test(fileName):
feedbackLib = cdll.LoadLibrary("./libpitch.so")
# Set return type to a character pointer
feedbackLib.getPitchString.restype = c_char_p
feedbackLib.getPitchString.argtypes = [c_char_p]
# Crashes Here!
feedbackStr = feedbackLib.getPitchString(fileName)
return feedbackStr
:
// ... A bunch of code
if(tempBuffer) {
delete[] tempBuffer;
// More code below that never runs...
Pythonコード失敗:ctypesのと組み合わせると、それは、常にこのC++ラインでクラッシュだから:上記の関数(私がする必要がある)に物事を追加し始めると、他のglibcエラーが出ます。
ここでは、関連する場合のC++のコンパイル方法について説明します。 extern "C" を使用して、私が呼んでいる関数の
ヘッダーは、C++コードはctypesので作業を取得する方法のようだ:コマンド++
extern "C" char* getPitchString(char* filename);
グラム:
$(CXX) $(LDFLAGS) -fPIC -c $(SRCS) $(LIBS)
$(CXX) -shared -Wl,-soname,libpitch.so -o libpitch.so $(OBJS) $(LIBS)
Pythonコードが正しく表示されます。 'getPitchString'が' free'を呼び出すのはなぜですか? –
getPitchStringは、C++ライブラリ内から一連のコードを呼び出します。 –