Tworzenie statycznego pliku wykonywalnego Haskell Linux
Nieczęsto dwie rzeczy, które tak bardzo kocham, spotykają się, aby przysporzyć mi tyle irytacji (oprócz moich dzieci). Napisałem program Haskell w pracy, który używa bibliotek takich jak tekst, XML-enumerator, attoparsec-text, itp. Mam go działa poprawnie na moim komputerze z systemem Windows w pracy, moja maszyna wirtualna Ubuntu w pracy( 32-bit), mój pulpit Ubuntu (32-bit ponownie) i instancja EC2 z Ubuntu (64-bit).
Nasz klient działa CentOS 5.3, 64-bit. Nie mogę tego dostać. wykonywalny do prawidłowego działania. Próbowałem stworzyć statyczny plik wykonywalny używając:
ghc --make myprog.hs -optl-static -optl-pthread
Ale kiedy próbuję uruchomić ten plik wykonywalny na serwerze CentOS, pojawia się komunikat o błędzie:
openFile: invalid argument (Invalid argument)
Zakładam, że jest to związane z opisywanym tu błędem. Próbowałem kompilacji z 32 i 64 bit Ubuntu, próbowałem statycznych i współdzielonych kompilacji, nic nie działa (choć czasami dostaję segfaults zamiast powyższego komunikatu o błędzie). Mogę spróbować pobrać CentOS 5.3 i stworzyć maszynę wirtualną na to, ale pobranie zajmie trochę czasu i nie jestem pewien, która wersja GHC będzie na nim działać(próbowałem dostać GHC 7 na ich serwerze, ale napotkałem problem z libc).
W tym momencie wymyśliłem kilka możliwych podejść, ale chciałbym ich uniknąć, jeśli w ogóle jest to możliwe:
- przepisać w innym języku(myśl o zrobieniu tego w Javie sprawia, że mdli mnie, choć może to być dobry czas, aby wypróbować Cal / OpenQuark).
- Może wypróbuj alternatywny kompilator, jak jhc. Ale nie jestem do końca pewien, jak zacząć instalować wszystkie zależności dla tego programu w jhc; jeśli ludzie mają doświadczenie i wiedzą, że text / attoparsec / etc działa w jhc, chciałbym to usłyszeć.
- Hack wszystkich hacków: zbuduj plik wykonywalny Windows, Zainstaluj wine na swoim serwerze i uruchom go w ten sposób.
3 answers
Ten prosty przykład "działa dla mnie":
$ cat A.hs
main = print "yes"
$ ghc -O2 --make -static -optc-static -optl-static A.hs -fvia-C -optl-pthread
$ ldd A
not a dynamic executable
$ ./A
"yes"
(i użyłem tego procesu, via .cabal, aby wysyłać pliki wykonywalne dla klientów w ciągu ostatnich kilku lat).
Myślę, że najlepszym wyjściem jest zgłaszanie błędów i uruchamianie tego. IHG może również finansować takie prace, ale jestem całkiem pewien, że zespół GHC uznałby to za wysoki priorytet, jeśli próbujesz wysłać produkty.
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-05-10 17:13:01
Jest powiązany ze starą biblioteką glibc w CentOS. Musisz skompilować z tą samą wersją glibc, co zainstalowana na CentOS.
Miałem dokładnie ten sam problem. Haskell wykonywalny skompilowany na arch (lub ubuntu) nie będzie działać na CentOS. W moim przypadku jednak miałem szczęście, ponieważ nasz admin właśnie usunął CentOS i zainstalował Arch dla serwera aplikacji.
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-05-10 17:21:06
Odkryłem problem. Wygląda na to, że link do strony Biohaskell jest dokładny: jest to problem z ładowaniem iconv. Występuje podczas wywoływania openFile
, ale nie podczas wywoływania openBinaryFile
. Ponieważ xml-enumerator
używa tego ostatniego, działało dobrze. Przełączenie reszty kodu na openBinaryFile
zamiast (poprzez Data.Enumerator.Binary.enumFile
) sprawiło, że wszystko zaczęło działać.
Jest to dobre obejście dla mojego przypadku użycia, ale błąd nadal istnieje.
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-05-11 08:52:41