7

私はこのCコードを持っています:

... [SNIP] ...
for(Node = Plugin.Head; Node != NULL; Node = Node->Next) {
    //Create new python sub-interpreter
    Node->Interpreter = Py_NewInterpreter();
    if(Node->Interpreter == NULL) {
        Die("Py_NewInterpreter() failed");
    }

    //Create path to plugins main source file
    snprintf(Filename, FILENAME_MAX, "%s/main.py", Node->File);

    //Convert filename to python string
    PFilename = PyString_FromString(Filename);
    if(PFilename == NULL) {
        Die("PyString_FromString(%s) failed", Filename);
    }

    //Import plugin main source file
    PModule = PyImport_Import(PFilename);
    if(PModule == NULL) {
        Die("PyImport_Import(%s) failed", Filename);
    }

    //Deallocate filename
    Py_DECREF(PFilename);

    //Get reference to onLoad function from module
    PFunction = PyObject_GetAttrString(PModule, "onLoad");
    if(PFunction == NULL) {
        Die("PyObject_GetAttrString() failed");
    }
}
... [SNIP] ...

コンパイル時に次のエラーが発生します。

/tmp/ccXNmyPy.o: In function `LoadPlugins':
/home/alex/Code/Scribe/Scribe.c:693: undefined reference to `PyString_FromString'
collect2: error: ld returned 1 exit status

Python.h は、ソース ファイルの先頭に含まれています。

私はコンパイルしています:

gcc -funwind-tables -rdynamic -I /usr/include/python2.7/ -g -o Scribe Scribe.c -lcurses `python-config --cflags` `python-config --ldflags` -Wall

ここから、Python C-Api docs に基づいてコードを作成しています。

http://docs.python.org/2/c-api/

具体的には:

http://docs.python.org/2/c-api/string.html?highlight=pystring_fromstring#PyString_FromString

なぜこれが起こっているのか分かりません。半分?=c

4

2 に答える 2

5

マルティノーの助けのおかげで解決しました。

検索パスに python3.3 インクルード ディレクトリを含め、python3.3 lib をリンクした行が生成されたフラグを見つけpython-config --cflagsます。python-config --ldflags

当然のことながら、python3.3 は python2.7 C-API ではうまく機能しません。これがこの問題の原因です。

私の解決策は、の出力をコピーしてpython-config --cflags編集python-config --ldflagsし、python3.3m の代わりに python2.7 を含めることでした。

-I/usr/include/python2.7 -I/usr/include/python2.7 -Wno-unused-result -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2

-lpthread -ldl -lutil -lm -lpython2.7 -Xlinker -export-dynamic

それ以外の:

-I/usr/include/python3.3m -I/usr/include/python3.3m -Wno-unused-result -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2

-lpthread -ldl -lutil -lm -lpython3.3m -Xlinker -export-dynamic
于 2013-05-26T02:18:24.727 に答える
1

ライブラリの順序は重要です。ライブラリ リストの最後に -lpython2.7 を指定してコンパイルしてみてください。

于 2015-06-23T23:11:54.060 に答える