gcc编译python代码_编译错误gcc与Python.h

本文描述了尝试在C++中嵌入Python代码时遇到的编译问题,特别是使用Python.h时出现的链接错误。问题在于缺少链接到libpython库的标志。解决方案是在g++编译命令中添加-lpython2.6选项,以链接到正确的Python库。
摘要由CSDN通过智能技术生成

I am trying to embed python in c++ and I have been playing with some sample code for a while. I was working with boost python interpreter and it works okay but right now I cannot seem to compile some c++ code that uses Python.h. I get an error that seems to be the library is not referenced correctly (this code is supposed to work as it is copied straight off of http://www.codeproject.com/Articles/11805/Embedding-Python-in-C-C-Part-I). I have tried many flags for compiling. Any help will be much appreciated! Thanks :)

Below is the one example and the error I received:

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

The following is the c++ code

// 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;

}

The following is the python script:

'''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

解决方案

You need to compile with -lpython2.6.

The compiler is unable to find the python functions, which are defined in libpythonX.Y.so. To tell it to use that library, you need to add -lpythonX.Y. As your Python version is 2.6, you need to use -lpython2.6.

The fact that you're getting things like (.text+0xf00) tells you that this is a linker problem, which means that your code itself is fine. The problem is just that some functions are not fully defined. This means, the compiler knew the prototype (that is, return type and argument values) while compiling (from the header), but it doesn't know where the actual code is. It is up to the linker to figure that out, and it cannot know by magic where it'll find the neccessary functions.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值