2016-02-03 10 views
6

Piszę program w Crystal, który zamierzam skompilować i przenieść do innych systemów w celu wykonania. Najlepiej byłoby, gdyby nie miał żadnych zależności, ponieważ systemy docelowe będą świeżymi instalacjami systemu Linux.Jak mogę utworzyć plik wykonywalny Crystal bez żadnych zależności?

Niestety, nie mogę obejść zależności od biblioteki libc, więc prawdopodobnie będę musiał skompilować plik wykonywalny w systemie posiadającym najniższą wersję biblioteki libc, którą chcę kierować. Sądzę, że powinien on być zgodny z przyszłością.

Mam jednak problemy z libssl. Domyślne instalacji Debiana wheezy nie wydają się pochodzić z libssl, więc ten błąd, gdy uruchomiony mój plik wykonywalny:

error while loading shared libraries: libssl.so.1.0.0: 
cannot open shared object file: No such file or directory 

Zakładam ten zależność istnieje, bo require "http/client" w moim źródłem. Nie wykonuję jednak połączeń związanych z SSL, ponieważ używam go tylko do łączenia się z niezabezpieczonymi witrynami.

ja widocznie też zależność od libevent-2.0.so.5. Prawdopodobnie wszystkie programy Crystal działają. Kto wie, ile ma innych zależności od Crystal?

Moje pliki wykonywalne muszą działać na świeżo zainstalowanym systemie Linux. Jak mogę utworzyć plik wykonywalny Crystal bez żadnych zależności? Przypuszczam, że jest inaczej niż libc.

+0

Podoba mi się to pytanie; kiedyś wszystko było statycznie powiązane. Robak się obraca. – will

Odpowiedz

7

W Linuksie można notować współdzielonych bibliotek, które wykonywalny potrzeby używając komendy ldd. W OSX, otool -L może być używany do tego samego celu.

Zwykle linker będzie używać bibliotek współdzielonych podczas budowania pliku wykonywalnego, jeśli będzie mógł je znaleźć. Tak więc, co musisz zrobić, zmusza linker do korzystania z bibliotek statycznych. (W przyszłości możemy dodać flagę do kompilatora, aby wymusić ten wybór)

powinny znaleźć niektóre z tych bibliotek statycznych w/opt/kryształ/embedded/lib. Używamy ich do generowania przenośnego kompilatora Crystal.

W celu wykorzystania tych bibliotek można uruchomić:

$ LIBRARY_PATH=/opt/crystal/embedded/lib crystal build my_app.cr 

To powinno wolą bibliotek dostępnych w tym katalogu przed rozważeniem zainstalowane w standardowych lokalizacjach innych.

Niestety, OpenSSL nie jest dystrybuowany z Crystal, więc musisz albo skopiować albo zbudować statyczną wersję libssl i libcrypto. W każdym razie jest to zwykła biblioteka dostępna w dowolnej dystrybucji Linuksa.

Jeśli chodzi o libc, to jest trudniejsze. Kompilujemy plik binarny Crystal do wydania za pomocą starych dystrybucji CentOS i Debian, aby był kompatybilny z wieloma innymi wersjami libc.

+1

Awesome, thanks. Miałem powodzenie z 'kryształową kompilacją FILE.cr - cross-kompilacja" Linux x86_64 "--target" x86_64-unknown-linux-gnu "' i 'cc FILE.o -o FILE -Wl, -Bstatic -levent -lpcre -lssl -lgc -lcrypto -lz -Wl, -Bdynamic -ldl -lrt -lpthread -lc', ale twoja droga jest znacznie prostsza. Użyłem 'apt-file' do zlokalizowania plików' .a', a następnie zmapowałem je do katalogu lib kryształów. –

+0

Czy statycznie powiązany 32-bitowy skompilowany plik wykonywalny działa poprawnie w 64-bitowym systemie Linux? –

+0

'objdump' jest przydatny również do notowania bibliotek dynamicznych. –

Powiązane problemy