una paquetes otro modulos lista libreria importar directorio desde crear como comando bibliotecas python static compilation

paquetes - lista de modulos de python



Cómo vincular estáticamente una biblioteca al compilar una extensión de módulo de Python (3)

¿Alguna posibilidad de que esto funcione?

g++ -Wl,-Bstatic -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed

Me gustaría modificar un archivo setup.py para que el comando "python setup.py build" compile un módulo de extensión basado en C que está estático (en lugar de dinámicamente) vinculado a una biblioteca.

La extensión está actualmente vinculada dinámicamente a varias bibliotecas. Me gustaría dejar todo sin cambios, excepto el enlace estático a una sola biblioteca. Lo he hecho con éxito modificando manualmente la llamada a gcc que ejecuta distutils, aunque requería que enumerara explícitamente las bibliotecas dependientes.

Quizás esto sea demasiada información, pero para mayor claridad, este es el comando de enlace final que se ejecutó durante el script "python setup.py build":

gcc -pthread -shared -L/system/lib64 -L/system/lib/ -I/system/include build/temp.linux-x86_64-2.7/src/*.o -L/system/lib -L/usr/local/lib -L/usr/lib -ligraph -o build/lib.linux-x86_64-2.7/igraph/core.so

Y esta es mi modificación manual:

gcc -pthread -shared -L/system/lib64 -L/system/lib/ -I/system/include build/temp.linux-x86_64-2.7/src/*.o -L/system/lib -L/usr/local/lib -L/usr/lib /system/lib/libigraph.a -lxml2 -lz -lgmp -lstdc++ -lm -ldl -o build/lib.linux-x86_64-2.7/igraph/core.so

La sección 2.3.4 de Distribuir módulos de Python analiza la especificación de las bibliotecas, pero solo las "bibliotecas_dir" son apropiadas y esas bibliotecas están vinculadas dinámicamente.

Estoy usando un entorno Linux para el desarrollo, pero el paquete también se compilará e instalará en Windows, así que lo que busco es una solución portátil.

¿Alguien me puede decir dónde buscar instrucciones o cómo modificar el script setup.py? (¡Gracias por adelantado!)

Soy nuevo en StackOverflow, así que mis disculpas si no he etiquetado correctamente esta pregunta, o si he cometido algún otro error en esta publicación.


6 - 7 años más tarde, la vinculación estática con las extensiones de Python todavía está mal documentada. Este Q / A me ayudó a encontrar la solución, pero tal como está ahora, no está claro.

En Linux / Unix

Las bibliotecas estáticas están vinculadas como archivos de objetos y deben ir con la ruta a extra_objects .

En Windows

El compilador ve si la biblioteca enlazada es estática o dinámica y el nombre de la biblioteca estática va a la lista de bibliotecas y los directorios a library_dir

Solución para ambas plataformas.

Para el siguiente explorador, estoy usando el escenario de biblioteca de OP, que vincula igraph static z , xml2 y gmp dynamic. Esta solución es un poco complicada, pero al menos hace lo correcto para cada plataforma.

static_libraries = [''igraph''] static_lib_dir = ''/system/lib'' libraries = [''z'', ''xml2'', ''gmp''] library_dirs = [''/system/lib'', ''/system/lib64''] if sys.platform == ''win32'': libraries.extend(static_libraries) library_dirs.append(static_lib_dir) extra_objects = [] else: # POSIX extra_objects = [''{}/lib{}.a''.format(static_lib_dir, l) for l in static_libraries] ext = Extension(''igraph.core'', sources=cmf_files, libraries=libraries, library_dirs=library_dirs, include_dirs=include_dirs, extra_objects=extra_objects)

En macos

Supongo que esto funciona también para MacOS (usando la ruta else ) pero no lo he probado.


Si todo lo demás falla, siempre están las opciones extra_compile_args y extra_link_args poco documentadas en el generador de Extension . (Véase también here ).

Es posible que deba piratear algún código dependiente del sistema operativo para obtener el formato de argumento correcto para una plataforma en particular.