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.
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.
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.
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
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