2009-10-10 9 views
6

Resumen: La creación de Python 3.1 en RHEL 5.3 de 64 bits con --enable-shared no compila todas las extensiones. Construir "normal" funciona bien sin ningún problema.Python 3.1.1 con --enable-shared: no compilará ninguna extensión

Tenga en cuenta que esta pregunta puede difuminar la línea entre la programación y la administración del sistema. Sin embargo, creo que debido a que tiene que tratar directamente con la implementación del soporte de idiomas, y tiene mucho que ver con el apoyo al proceso de programación, lo publicaría aquí. También en: https://serverfault.com/questions/73196/python-3-1-1-with-enable-shared-will-not-build-any-extensions. ¡Gracias!

Problema:

Edificio Python 3.1 en RHEL 5.3 64 bits con --enable-shared falla al compilar todas las extensiones. Construir "normal" funciona bien sin ningún problema.

Puedo construir python 3.1 bien, pero cuando se construye como una biblioteca compartida, emite muchas advertencias (ver a continuación) y se niega a construir cualquiera de los módulos basados ​​en c. A pesar de este error, aún puedo compilar mod_wsgi 3.0c5 contra él y ejecutarlo en apache. Huelga decir que la funcionalidad de Python se reduce en gran medida ...

Es interesante notar que Python 3.2a0 (de svn) compila bien con --enable-shared, y mod_wsgi compila bien contra ello. Pero al iniciar Apache, recibo:

Cannot load /etc/httpd/modules/mod_wsgi.so into server: /etc/httpd/modules/mod_wsgi.so: undefined symbol: PyCObject_FromVoidPtr

El proyecto que se trata es un proyecto a largo plazo, por lo que estoy bien con el software de calidad alpha si es necesario. Aquí hay más detalles sobre el problema.

Anfitrión:

  • Dell PowerEdge
  • Intel Xenon
  • RHEL 5.3 de 64 bits
  • Nada "especial"

Cuerpo:

  • Python 3.1.1 fuente de distribución
  • funciona bien con ./configure
  • No funciona bien con ./configure --enable-shared

(export CFLAGS="-fPIC" se ha hecho)

salida del comando make


gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -fPIC -DPy_BUILD_CORE -c ./Modules/_weakref.c -o Modules/_weakref.o


building 'bz2' extension gcc -pthread -fPIC -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -I./Include -I/usr/local/include -IInclude -I/home/build/RPMBUILD/BUILD/Python-3.1.1 -c /home/build/RPMBUILD/BUILD/Python-3.1.1/Modules/bz2module.c -o build/temp.linux-x86_64-3.1/home/build/RPMBUILD/BUILD/Python-3.1.1/Modules/bz2module.o gcc -pthread -shared -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes build/temp.linux-x86_64-3.1/home/build/RPMBUILD/BUILD/Python-3.1.1/Modules/bz2module.o -L/usr/local/lib -L. -lbz2 -lpython3.1 -o build/lib.linux-x86_64-3.1/bz2.so /usr/bin/ld: /usr/local/lib/libpython3.1.a(abstract.o): relocation R_X86_64_32 against 'a local symbol' can not be used when making a shared object; recompile with -fPIC


Failed to build these modules: 
_bisect   _codecs_cn   _codecs_hk 
_codecs_iso2022 _codecs_jp   _codecs_kr 
_codecs_tw   _collections  _csv 
_ctypes   _ctypes_test  _curses 
_curses_panel  _dbm    _elementtree 
_gdbm    _hashlib   _heapq 
_json    _lsprof   _multibytecodec 
_multiprocessing _pickle   _random 
_socket   _sqlite3   _ssl 
_struct   _testcapi   array 
atexit    audioop   binascii 
bz2    cmath    crypt 
datetime   fcntl    grp 
itertools   math    mmap 
nis    operator   ossaudiodev 
parser    pyexpat   readline 
resource   select    spwd 
syslog    termios   time 
unicodedata  zlib 

Respuesta

5

Algo está mal con su entorno de construcción. Está recogiendo un libpython3.1.a de /usr/local/lib; esto confunde los mensajes de error. Intenta vincularse con esa biblioteca, lo que falla; sin embargo, no debería haber intentado eso en primer lugar, ya que debería haber usado el libpython que acaba de crear. Recomiendo tomar la instalación de Python 3.1 en /usr/local fuera del camino.

No se muestra en su salida si se creó un libpython3.1.so.1.0 en el árbol de compilación; sería importante averiguar si existe, cómo se vinculó y qué símbolos ha exportado.

+0

Hola Martin, me gustaría comentar que este 100% solucionó el problema que estaba teniendo. ¡Gracias! ¿Tiene alguna idea de por qué estaría buscando en/usr/local en lugar de/home/build/RPMBUILD/BUILD/...? – gahooa

+1

Al volver a leer la línea del vinculador, queda claro: '-L/usr/local/lib' es anterior a' -L. –

0

/usr/local/lib se ha añadido a la biblioteca ruta de inclusión en tiempo de compilación:

-L/usr/-L local/lib.

Es común que el tiempo de compilación busque múltiples rutas 'comunes' para las bibliotecas (/ usr/lib,/usr/local/lib, ./, etc.) pero también, posiblemente esté recogiendo/usr/local/lib de la variable de entorno LD_LIBRARY_PATH y virando sobre el comando de compilación.

+0

Interesante ... ¿Cómo le indicaría que busque en "." PRIMERO, antes en cualquier otro lugar? – gahooa

+0

La variable LD_LIBRARY_PATH no se debe usar de esa manera, por lo que si está utilizando directorios de LD_LIBRARY_PATH para agregar a los indicadores del compilador, se puede decir que está roto. –

Cuestiones relacionadas