Jak statycznie połączyć bibliotekę podczas kompilacji rozszerzenia modułu Pythona

Chciałbym zmodyfikować setup.py plik taki, że polecenie "python setup.py build" kompiluje oparty na C moduł rozszerzenia, który jest statycznie (a nie dynamicznie) połączony z biblioteką.

Rozszerzenie jest obecnie dynamicznie połączone z wieloma bibliotekami. Chciałbym pozostawić wszystko bez zmian z wyjątkiem statycznego linkowania do tylko jednej biblioteki. Udało mi się to zrobić ręcznie modyfikując wywołanie do gcc, które uruchamia distutils, chociaż wymagało to jawnie wymieniono zależne biblioteki.

Być może jest to zbyt dużo informacji, ale dla jasności jest to ostateczne polecenie łączące, które zostało wykonane podczas "python setup.py zbuduj" skrypt:

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

A to jest moja ręczna modyfikacja:

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

Sekcja 2.3.4 dystrybucji modułów Pythona omawia specyfikację bibliotek, ale tylko" library_dirs " jest odpowiednia i biblioteki te są dynamicznie połączone.

Używam środowiska Linux do rozwoju, ale pakiet będzie również skompilowany i zainstalowany na Windows, więc przenośne rozwiązanie jest to, co jestem po.

Czy ktoś może mi powiedzieć gdzie szukać instrukcji lub jak zmodyfikować setup.py scenariusz? (Z góry dzięki!)

Jestem nowy w StackOverflow, więc przepraszam, jeśli nie otagowałem poprawnie tego pytania lub jeśli popełniłem jakiś inny błąd w tym wpisie.

Author: Matthew Walker, 2011-01-04

3 answers

Jeśli Wszystko inne zawiedzie, zawsze jest mało udokumentowane extra_compile_args i extra_link_args opcje do Extension budowniczy. (Patrz również tutaj.)

Być może będziesz musiał włamać się do kodu zależnego od systemu operacyjnego, aby uzyskać odpowiedni format argumentów dla konkretnej platformy.

 8
Author: detly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-05 03:01:44

6-7 lat później statyczne łączenie z rozszerzeniami Pythona jest nadal słabo udokumentowane. To pytanie pomogło mi znaleźć rozwiązanie, ale jak jest teraz, nie jest jasne.

Na Linuksie / Unixie

Biblioteki statyczne są połączone tak jak pliki obiektowe i powinny iść ze ścieżką do extra_objects.

W Systemie Windows

Kompilator widzi, czy linkowana Biblioteka jest statyczna czy dynamiczna i nazwa biblioteki statycznej trafia do listy bibliotek i katalogów do biblioteka_dir

Rozwiązanie dla obu platform

Używam części bibliotek z OP, łączących igraph statyczne i z, xml2 i gmp dynamiczny. To rozwiązanie jest trochę hackish, ale przynajmniej robi dla każdej platformy właściwą rzecz.

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)

Na MacOS

Myślę, że działa to również dla MacOS (przy użyciu ścieżki else), ale nie testowałem go.

 6
Author: oekopez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 07:40:15

Czy to może zadziałać?

g++ -Wl,-Bstatic -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed
 0
Author: Brian Bruggeman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-05 18:52:14