2016-05-06 8 views
0

私はCの関数のためのシンプルなSWIG Pythonラッパーを作成しようとしていますが、私はこの種のエラーは、異なるバージョンを使用することによって引き起こされることを読んSWIGのPythonラッパーは、Mac OSX上でクラッシュ

Fatal Python error: PyThreadState_Get: no current thread 

と、それは常にクラッシュpythonのビルド/リンク時と実行時には、この限りではありません。

新しいPython 3.4.4をダウンロード、ビルド、インストールしました。私は使用しているファイルが新しいファイルであることを確認しました。 私が行います

swig -python -o example_wrap.c -I. -I/usr/local/include/python3.4m example.i 
cc -fPIC -I. -I/usr/local/include/python3.4m -c example.c 
cc -fPIC -I. -I/usr/local/include/python3.4m -c example_wrap.c 
cc -shared -o _example.so example.o example_wrap.o /usr/local/lib/libpython3.4m.a 
/usr/local/bin/python3.4 -c "import example" 

はちょうど私がすべて同じ結果で、(MacPortsのから)clanggcc-mp-4.9を試してみました代わりにccで、確かに。

Fatal Python error: PyThreadState_Get: no current thread 

これはLinuxでも問題なく動作します。私はフレームワークのいずれかにリンクしているとは信じていませんが(python3.4はそうです)。 私はここで何が欠けていますか?ここ

コードである:

example.h

#ifndef HELLO_H 
#define HELLO_H 
extern void hello(); 
#endif 

example.c

#include <stdio.h> 
void hello() { 
    printf("Hello\n"); 
} 

example.i

%module example 
%{ 
#include "example.h" 
%} 
%include "example.h" 

Linki NGは以下の通りである。

otool -L /usr/local/bin/python3.4 
/usr/local/bin/python3.4: 
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1258.1.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1) 

otool -L _example.so 
_example.so: 
    _example.so (compatibility version 0.0.0, current version 0.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1) 

答えて

2

私はあなたとリンクすることになっていると思う:からのインポート時に二回

cc -shared -o _example.so example.o example_wrap.o -L/usr/local/lib -lpython3.4m 

そうでない場合は、libpython3.4m.aからいくつかのシンボルが共有オブジェクトに含まれていてもよいし、次に利用可能ですpython(?)

いずれの場合でも、私のシステム(MacPorts Python 3.4のOSX 10.11)では、どちらも動作します。

+0

あなたは正しいと思います。私のpythonは静的にリンクされているので、シンボルは重複しています。 Linuxのpythonと私の共有オブジェクトは動的にリンクされています。 –

関連する問題