Liaison statique avec libpython
Sujet: Liaison statique avec libpython De: invalid (l' arobase) nowhere.invalid.org (Alex Marandon) Groupes: fr.comp.lang.python
Date: 16. May 2008, 17:54:17
Bonjour,
Je travaille sur un petit module en C qui embarque l'interpréteur Python. J'arrive à lier mon code avec la bibliothèque partagée sans soucis particulier (en utilisant les options renvoyées par python2.5-config --ldflags).
Pour d'obscures raisons de compatibilité avec un logiciel propriétaire, j'essaie de lier mon code statiquement a la bibliothèque Python, en utilisant le .a qui se trouve sur ma Debian. J'ai écrit un petit programme de test pour vous montrer où je veux en venir :
#include <Python.h>
int main(int argc, char *argv[]) {
if (argc < 2) return(1);
Py_Initialize();
PyRun_SimpleString(argv[1]);
Py_Finalize();
return 0;
}
Avec une liaison dynamique, tout ce passe bien:
$ make
gcc -c -Wall `python2.5-config --cflags` -o t_python.o t_python.c
gcc `python2.5-config --ldflags` -o t_python t_python.o
$ ./t_python 'print "plop"'
plop
$ ./t_python 'from datetime import datetime; print datetime.now()'
2008-05-16 16:38:24.012268
Par contre en se liant avec le .a, voici ce qui se passe:
$ gcc -Wall t_python.o /usr/lib/python2.5/config/libpython2.5.a \
-o t_python -lpthread -ldl -lutil -lm
/usr/lib/python2.5/config/libpython2.5.a(posixmodule.o): In function `posix_tmpnam':
(.text+0x581): warning: the use of `tmpnam_r' is dangerous, better use `mkstemp'
/usr/lib/python2.5/config/libpython2.5.a(posixmodule.o): In function `posix_tempnam':
(.text+0x66f): warning: the use of `tempnam' is dangerous, better use `mkstemp'
Il y a des avertissements, mais l'éxécutable a bien été généré. Par contre à l'éxécution :
$ ./t_python 'print "plop"'
plop
$ ./t_python 'from datetime import datetime; print datetime.now()'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: /usr/lib/python2.5/lib-dynload/datetime.so: undefined symbol: PyExc_IOError
Voila ou j'en suis.
Je fournis aussi le Makefile de base si vous souhaitez reproduire cela chez vous :
$ cat Makefile
CC=gcc
CFLAGS=-Wall `python2.5-config --cflags`
LDFLAGS=`python2.5-config --ldflags`
t_python: t_python.o
$(CC) $(LDFLAGS) -o $@ $?
t_python.o: t_python.c
$(CC) -c $(CFLAGS) -o $@ $?
Bravo et merci de m'avoir lu :-)
| Date | Sujet | | Auteur |
| 16.05. | Liaison statique avec libpython | | Alex Marandon |
|
| actualité |
Sortie officielle de Iron Python 1.0Maroc IT - 12 juin 2008Sortie officielle de Iron Python, v1.0, permettant de compiler/executer du code python sur une machine virtuelle .net ' autant personellement je n'aime pas ... |
|
| source |
|