3

私は c++ に python を埋め込もうとしていますが、しばらくサンプル コードで遊んでいます。ブースト python インタープリターを使用していましたが、問題なく動作しますが、現在、Python.h を使用する c++ コードをコンパイルできないようです。ライブラリが正しく参照されていないように見えるエラーが表示されます (このコードはhttp://www.codeproject.com/Articles/11805/Embedding-Python-in-CC-から直接コピーされているため、動作するはずです)。パート I )。コンパイルのために多くのフラグを試しました。どんな助けでも大歓迎です!ありがとう :)

以下は、一例と私が受け取ったエラーです。

g++ -Wall -o call_function call_function.c

call_function.c: In function âint main(int, char**)â:
call_function.c:61:56: warning: format â%dâ expects argument of type âintâ, but argument 2 has type âlong intâ [-Wformat]
/tmp/ccAUMMHm.o: In function `main':
call_function.c:(.text+0x2a): undefined reference to `Py_Initialize'
call_function.c:(.text+0x3d): undefined reference to `PyString_FromString'
call_function.c:(.text+0x4d): undefined reference to `PyImport_Import'
call_function.c:(.text+0x5d): undefined reference to `PyModule_GetDict'
call_function.c:(.text+0x7b): undefined reference to `PyDict_GetItemString'
call_function.c:(.text+0x8b): undefined reference to `PyCallable_Check'
call_function.c:(.text+0xb2): undefined reference to `PyTuple_New'
call_function.c:(.text+0xe5): undefined reference to `PyInt_FromLong'
call_function.c:(.text+0xf5): undefined reference to `PyErr_Print'
call_function.c:(.text+0x118): undefined reference to `PyTuple_SetItem'
call_function.c:(.text+0x13f): undefined reference to `PyObject_CallObject'
call_function.c:(.text+0x195): undefined reference to `PyObject_CallObject'
call_function.c:(.text+0x1ac): undefined reference to `PyInt_AsLong'
call_function.c:(.text+0x1fd): undefined reference to `PyErr_Print'
call_function.c:(.text+0x204): undefined reference to `PyErr_Print'
call_function.c:(.text+0x279): undefined reference to `Py_Finalize'
collect2: ld returned 1 exit status

以下はC++コードです

// call_function.c - A sample of calling python functions from C code
//
#include "/usr/include/python2.6/Python.h"

int main(int argc, char *argv[])
{
    int i;
    PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue;
    if (argc < 3)
    {
        printf("Usage: exe_name python_source function_name\n");
        return 1;
    }
    // Initialize the Python Interpreter
    Py_Initialize();
    // Build the name object
    pName = PyString_FromString(argv[1]);
    // Load the module object
    pModule = PyImport_Import(pName);
    // pDict is a borrowed reference
    pDict = PyModule_GetDict(pModule);
    // pFunc is also a borrowed reference
    pFunc = PyDict_GetItemString(pDict, argv[2]);
    if (PyCallable_Check(pFunc))
    {
        // Prepare the argument list for the call
        if( argc > 3 )
        {
                pArgs = PyTuple_New(argc - 3);
                for (i = 0; i < argc - 3; i++)
                {
                    pValue = PyInt_FromLong(atoi(argv[i + 3]));
                    if (!pValue)
                    {
                        PyErr_Print();
                        return 1;
                    }
                    PyTuple_SetItem(pArgs, i, pValue);
                }
                pValue = PyObject_CallObject(pFunc, pArgs);
                if (pArgs != NULL)
                {
                    Py_DECREF(pArgs);
                }
        } else
        {
                pValue = PyObject_CallObject(pFunc, NULL);
        }
        if (pValue != NULL)
        {
            printf("Return of call : %d\n", PyInt_AsLong(pValue));
            Py_DECREF(pValue);
        }
        else
        {
            PyErr_Print();
        }
    } else
    {
        PyErr_Print();
    }

    // Clean up
    Py_DECREF(pModule);
    Py_DECREF(pName);
    // Finish the Python Interpreter
    Py_Finalize();
    return 0;
}

以下は Python スクリプトです。

'''py_function.py - Python source designed to '''
'''demonstrate the use of python embedding'''

def multiply():
    c = 12345*6789
    print 'The result of 12345 x 6789 :', c
    return c
4

1 に答える 1

7

でコンパイルする必要があります-lpython2.6

コンパイラは、 で定義されている python 関数を見つけることができませんlibpythonX.Y.so。そのライブラリを使用するように指示するには、追加する必要があります-lpythonX.Y。Python のバージョンは 2.6 なので、 を使用する必要があります-lpython2.6

のような結果が得られたという事実(.text+0xf00)は、これがリンカの問題であることを示しています。つまり、コード自体は問題ありません。問題は、一部の関数が完全に定義されていないことです。つまり、コンパイラは (ヘッダーから) コンパイル中にプロトタイプ (つまり、戻り値の型と引数の値) を認識していましたが、実際のコードがどこにあるかは認識していません。それを理解するのはリンカー次第であり、必要な関数がどこにあるかを魔法で知ることはできません。

于 2013-01-10T14:32:24.107 に答える