Trying to extend Python with C: undefined reference to `Py_BuildValue'

Ivan Illarionov ivan.illarionov at gmail.com
Wed Jun 4 10:13:55 EDT 2008


On Wed, 04 Jun 2008 05:57:20 -0700, spectrumdt wrote:

> Hello.
> 
>   I am trying to extend Python with some C code. I made a trivial
> "Hello World" program in C that I am trying to wrap in "boilerplate" for
> inclusion in a Python program. But I can't compile the C code. The C
> compiler cannot find the required function `Py_BuildValue'.
> 
>   My C code looks like this:
> 
> 
> 
>   #include "/usr/include/python2.5/Python.h"
> 
>   /* Python wrapper for 'main'. */
>   static PyObject* mpi_main() {
>     int res = main();
>     PyObject* retval = (PyObject*)Py_BuildValue("i",res);
>   }
> 
>   /* Main. A 'Hello World' function. */ int main() {
>     printf ("Hello, World. I am a C function.\n");
>   }
> 
> 
> 
>   And my error message looks like this:
> 
> 
> 
>   [ore at localhost Opgave03]$ gcc ctest.c /tmp/ccH46bs8.o: In function
>   `mpi_main': ctest.c:(.text+0x1d): undefined reference to
>   `Py_BuildValue' collect2: ld returned 1 exit status
>   [ore at localhost Opgave03]$
> 
> 
> 
>   I searched the newsgroup and found this thread:
> 
> 
> http://groups.google.com/group/comp.lang.python/browse_thread/thread/
c6d70e02a6bc9528/87b836f369bd0042?lnk=gst&q=undefined+reference+to+%
60Py_BuildValue%27#87b836f369bd0042
> 
>   It recommended that I add the option "-Wl,--export-dynamic" when
> calling gcc. That makes no difference. The thread also has some more
> stuff that I don't quite understand.
> 
>   Can anyone help? I am including Python.h, so why does it not find
> Py_BuildValue?
> 
>   Thanks in advance.

Hi! Your C code contains too many errors. I'm lazy to comment them all.

Here's my take on the trivial "Hello world" in Python C API:

1. create 'hello.c' file with the following content:
#include <Python.h>

PyObject* 
hello(PyObject* self)
{
    printf("Hello world!\n");
    Py_RETURN_NONE;
}

static PyMethodDef functions[] = {
    {"hello",    (PyCFunction)hello, METH_NOARGS},
    {NULL, NULL, 0, NULL},
};

DL_EXPORT(void)
init_hello(void)
{
    Py_InitModule("_hello", functions);
}

2. create 'buildme.py' file with this content:
import os
import sys
from distutils.core import Extension, setup

os.chdir(os.path.dirname(os.path.abspath(__file__)))
sys.argv = [sys.argv[0], 'build_ext', '-i']
setup(ext_modules = [Extension('_hello', ["hello.c"])])

3. run "python buildme.py"

That's all.
>>> from _hello import hello
>>> hello()
Hello world!


-- Ivan



More information about the Python-list mailing list