gpt4 book ai didi

c++ - 使用 Python.h 编译错误 gcc

转载 作者:太空狗 更新时间:2023-10-29 20:15:10 26 4
gpt4 key购买 nike

我正在尝试将 Python 嵌入到 C++ 中,我已经研究了一些示例代码一段时间。我正在使用 boost python 解释器,它工作正常,但现在我似乎无法编译一些使用 Python.h 的 c++ 代码。我得到一个错误,似乎是库没有被正确引用(这段代码应该可以工作,因为它是直接从 http://www.codeproject.com/Articles/11805/Embedding-Python-in-C-C-Part-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

最佳答案

需要用-lpython2.6编译

编译器无法找到 libpythonX.Y.so 中定义的 python 函数。要告诉它使用该库,您需要添加 -lpythonX.Y。由于你的Python版本是2.6,你需要使用-lpython2.6

您得到类似 (.text+0xf00) 的事实告诉您这是一个链接器问题,这意味着您的代码本身没有问题。问题只是有些功能没有完全定义。这意味着,编译器在编译时(从头文件)知道原型(prototype)(即返回类型和参数值),但不知道实际代码在哪里。由链接器来解决这个问题,它无法通过魔法知道它将在哪里找到必要的函数。

关于c++ - 使用 Python.h 编译错误 gcc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14260196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com