Python Forum
Embedded python fails to compile on Raspberry Pi - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Embedded python fails to compile on Raspberry Pi (/thread-31605.html)



Embedded python fails to compile on Raspberry Pi - tryfon - Dec-22-2020

Hi all!

I installed python 3.9.1 on my Raspberry Pi following the instructions here and set it as the default python interpreter. I got my compiling and linking parameters for embedded Python following the instructions here

I tried a simple test with the following code (test.c) :
int
main(int argc, char *argv[])
{
    wchar_t *program = Py_DecodeLocale(argv[0], NULL);
    if (program == NULL) {
        fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
        exit(1);
    }
    Py_SetProgramName(program);  /* optional but recommended */
    Py_Initialize();
    PyRun_SimpleString("from time import time,ctime\n"
                       "print('Today is', ctime(time()))\n");
    Py_Finalize();
    PyMem_RawFree(program);
    return 0;
}
and then

gcc -I/usr/local/opt/python-3.9.1/include/python3.9 -I/usr/local/opt/python-3.9.1/include/python3.9 -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -c test.c -o test.o

and

gcc -L/usr/local/opt/python-3.9.1/lib/python3.9/config-3.9-arm-linux-gnueabihf -L/usr/local/opt/python-3.9.1/lib -lcrypt -lpthread -ldl -lutil -lm -o test.o

and got
Error:
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/crt1.o: In function '_start': /build/glibc-P1SmLh/glibc-2.19/csu/../ports/sysdeps/arm/start.S:119: undefined reference to 'main' collect2: error: ld returned 1 exit status
Trying to compile the example over here throws the same error. What could the problem be?


RE: Embedded python fails to compile on Raspberry Pi - tryfon - Dec-22-2020

I made some progress after changing the linker command to:

gcc test.o -L/usr/local/opt/python-3.9.1/lib/python3.9/config-3.9-arm-linux-gnueabihf -L/usr/local/opt/python-3.9.1/lib -lcrypt -lpthread -ldl -lutil -lm -o test

but I got a bunch of other errors:

Error:
test.o: In function `main': /home/pi/Downloads/test.c:16: undefined reference to `Py_Initialize' /home/pi/Downloads/test.c:17: undefined reference to `PyUnicode_DecodeFSDefault' /home/pi/Downloads/test.c:20: undefined reference to `PyImport_Import' /home/pi/Downloads/test.c:24: undefined reference to `PyObject_GetAttrString' /home/pi/Downloads/test.c:27: undefined reference to `PyCallable_Check' /home/pi/Downloads/test.c:55: undefined reference to `PyErr_Occurred' /home/pi/Downloads/test.c:56: undefined reference to `PyErr_Print' test.o: In function `_Py_DECREF': /usr/local/opt/python-3.9.1/include/python3.9/object.h:430: undefined reference to `_Py_Dealloc' test.o: In function `main': /home/pi/Downloads/test.c:67: undefined reference to `Py_FinalizeEx' test.o: In function `_Py_DECREF': /usr/local/opt/python-3.9.1/include/python3.9/object.h:430: undefined reference to `_Py_Dealloc' test.o: In function `main': /home/pi/Downloads/test.c:55: undefined reference to `PyErr_Occurred' /home/pi/Downloads/test.c:56: undefined reference to `PyErr_Print' /home/pi/Downloads/test.c:28: undefined reference to `PyTuple_New' /home/pi/Downloads/test.c:38: undefined reference to `PyTuple_SetItem' /home/pi/Downloads/test.c:30: undefined reference to `PyLong_FromLong' test.o: In function `_Py_DECREF': /usr/local/opt/python-3.9.1/include/python3.9/object.h:430: undefined reference to `_Py_Dealloc' test.o: In function `main': /home/pi/Downloads/test.c:40: undefined reference to `PyObject_CallObject' /home/pi/Downloads/test.c:43: undefined reference to `PyLong_AsLong' test.o: In function `_Py_DECREF': /usr/local/opt/python-3.9.1/include/python3.9/object.h:430: undefined reference to `_Py_Dealloc' test.o: In function `main': /home/pi/Downloads/test.c:63: undefined reference to `PyErr_Print' test.o: In function `_Py_DECREF': /usr/local/opt/python-3.9.1/include/python3.9/object.h:430: undefined reference to `_Py_Dealloc' /usr/local/opt/python-3.9.1/include/python3.9/object.h:430: undefined reference to `_Py_Dealloc' test.o: In function `main': /home/pi/Downloads/test.c:49: undefined reference to `PyErr_Print' test.o: In function `_Py_DECREF': /usr/local/opt/python-3.9.1/include/python3.9/object.h:430: undefined reference to `_Py_Dealloc' /usr/local/opt/python-3.9.1/include/python3.9/object.h:430: undefined reference to `_Py_Dealloc' /usr/local/opt/python-3.9.1/include/python3.9/object.h:430: undefined reference to `_Py_Dealloc' collect2: error: ld returned 1 exit status
This seems more serious. Any ideas?


RE: Embedded python fails to compile on Raspberry Pi - tryfon - Dec-22-2020

OK, problem solved. It seems that the behavior of the python3-config script was changed in Python 3.8: https://docs.python.org/3/whatsnew/3.8.html#debug-build-uses-the-same-abi-as-release-build

To embed Python into an application, a new --embed option must be passed to python3-config --libs --embed to get -lpython3.8 (link the application to libpython). To support both 3.8 and older, try python3-config --libs --embed first and fallback to python3-config --libs (without --embed) if the previous command fails.

So I changed the linker command to
gcc test.o -L/usr/local/opt/python-3.9.1/lib/python3.9/config-3.9-arm-linux-gnueabihf -L/usr/local/opt/python-3.9.1/lib -lcrypt -lpthread -ldl -lutil -lm -lpython3.9 -o test

and it finally worked! Thanks a lot everyone!