2011-12-28 12 views
23

मैं बहुत Yesod के लिए नया हूँ और मैं मुसीबत के निर्माण Yesod स्थिर तो मैं Heroku को तैनात कर सकते हैं हो रही है।Heroku को Yesod नियोजित करना, निर्माण नहीं कर सकते स्थिर

मैं डिफ़ॉल्ट .cabal फ़ाइल को बदल दिया है स्थिर संकलन को प्रतिबिंबित करने के

if flag(production) 
    cpp-options: -DPRODUCTION 
    ghc-options: -Wall -threaded -O2 -static -optl-static 
else 
    ghc-options: -Wall -threaded -O0 

और यह नहीं रह गया है बनाता है।

Linking dist/build/personal-website/personal-website ... 
/usr/lib/ghc-7.0.3/libHSrts_thr.a(Linker.thr_o): In function 
`internal_dlopen': 
Linker.c:(.text+0x407): warning: Using 'dlopen' in statically linked 
applications requires at runtime the shared libraries from the glibc 
version used for linking 
/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In 
function `__hsunix_getpwent': 
HsUnix.c:(.text+0xa1): warning: Using 'getpwent' in statically linked 
applications requires at runtime the shared libraries from the glibc 
version used for linking 
/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In 
function `__hsunix_getpwnam_r': 
HsUnix.c:(.text+0xb1): warning: Using 'getpwnam_r' in statically 
linked applications requires at runtime the shared libraries from the 
glibc version used for linking 
/usr/lib/libpq.a(thread.o): In function `pqGetpwuid': 
(.text+0x15): warning: Using 'getpwuid_r' in statically linked 
applications requires at runtime the shared libraries from the glibc 
version used for linking 
/usr/lib/libpq.a(ip.o): In function `pg_getaddrinfo_all': 
(.text+0x31): warning: Using 'getaddrinfo' in statically linked 
applications requires at runtime the shared libraries from the glibc 
version used for linking 
/usr/lib/ghc-7.0.3/site-local/network-2.3.0.2/ 
libHSnetwork-2.3.0.2.a(BSD__63.o): In function `sD3z_info': 
(.text+0xe4): warning: Using 'gethostbyname' in statically linked 
applications requires at runtime the shared libraries from the glibc 
version used for linking 
/usr/lib/ghc-7.0.3/site-local/network-2.3.0.2/ 
libHSnetwork-2.3.0.2.a(BSD__164.o): In function `sFKc_info': 
(.text+0x12d): warning: Using 'getprotobyname' in statically linked 
applications requires at runtime the shared libraries from the glibc 
version used for linking 
/usr/lib/ghc-7.0.3/site-local/network-2.3.0.2/ 
libHSnetwork-2.3.0.2.a(BSD__155.o): In function `sFDs_info': 
(.text+0x4c): warning: Using 'getservbyname' in statically linked 
applications requires at runtime the shared libraries from the glibc 
version used for linking 
/usr/lib/libpq.a(fe-misc.o): In function `pqSocketCheck': 
(.text+0xa2d): undefined reference to `SSL_pending' 
/usr/lib/libpq.a(fe-secure.o): In function `SSLerrmessage': 
(.text+0x31): undefined reference to `ERR_get_error' 
/usr/lib/libpq.a(fe-secure.o): In function `SSLerrmessage': 
(.text+0x41): undefined reference to `ERR_reason_error_string' 
/usr/lib/libpq.a(fe-secure.o): In function `initialize_SSL': 
(.text+0x2f8): undefined reference to `SSL_check_private_key' 
/usr/lib/libpq.a(fe-secure.o): In function `initialize_SSL': 
(.text+0x3c0): undefined reference to `SSL_CTX_load_verify_locations' 
(... snip ...) 

तो मैं बस अभी -static और बिना -optl-static सब कुछ ठीक बनाता है लेकिन अनुप्रयोग क्रैश हो जाता है जब वह कोशिश करता है पर शुरू करने के लिए के साथ संकलन: मैं चेतावनी की एक पूरी गुच्छा और उसके बाद इस तरह अपरिभाषित संदर्भ उपस्थित धसान मिल Heroku।

2011-12-28T01:31:23+00:00 app[web.1]: ./dist/build/personal-website/ 
personal-website: /lib/libc.so.6: version `GLIBC_2.14' not found 
(required by ./dist/build/personal-website/personal-website) 
2011-12-28T01:31:23+00:00 app[web.1]: ./dist/build/personal-website/ 
personal-website: /lib/libc.so.6: version `GLIBC_2.14' not found 
(required by /app/dist/build/personal-website/libgmp.so.10) 
2011-12-28T01:31:25+00:00 heroku[web.1]: State changed from starting 
to crashed 
2011-12-28T01:31:25+00:00 heroku[web.1]: Process exited 

ऐसा लगता है कि libc का संस्करण है कि मैं के खिलाफ संकलन कर रहा हूँ:

2011-12-28T01:20:51+00:00 heroku[web.1]: Starting process with command 
`./dist/build/personal-website/personal-website -p 41083` 
2011-12-28T01:20:51+00:00 app[web.1]: ./dist/build/personal-website/ 
personal-website: error while loading shared libraries: libgmp.so.10: 
cannot open shared object file: No such file or directory 
2011-12-28T01:20:52+00:00 heroku[web.1]: State changed from starting 
to crashed 

मैं के रूप में here में सुझाव दिया और फिर LD_LIBRARY_PATH को libgmp.so.10 जोड़ने की कोशिश की निम्न त्रुटि मिला अलग है। मैंने पुस्तकालयों के बैच में को libgmp के लिए भी libc जोड़ने का प्रयास किया, लेकिन यह परिणामस्वरूप सेगमेंटेशन गलती में होता है जब एप्लिकेशन हेरोोकू पक्ष पर शुरू होता है।

सबकुछ मेरे पीसी पर ठीक काम करता है। मैं ghc 7.0.3 के साथ 64 बिट archlinux चला रहा हूँ। The blog post on the official Yesod blog बहुत आसान देखा लेकिन मैं इस बिंदु पर stumped हूँ। क्या किसी के भी पास कोई सुझाव है? यदि इस बात को पर बिना स्थिर रूप से काम करने का कोई तरीका है, तो मैं भी इसके लिए खुला हूं।

संपादित

प्रति Employed Russians जवाब मैं इसे ठीक करने के लिए निम्न किया था।

पहले परियोजना निर्देशिका के तहत एक नया निर्देशिका lib बनाया है और इसे में लापता साझा पुस्तकालयों की नकल की। आप ldd path/to/executable और heroku run ldd path/to/executable चलाकर और आउटपुट की तुलना करके यह जानकारी प्राप्त कर सकते हैं।

मैं तो heroku config:add LD_LIBRARY_PATH=./lib किया इसलिए जब आवेदन शुरू कर दिया है गतिशील लिंकर नई lib निर्देशिका में पुस्तकालयों के लिए दिखेगा।

अंत में मैं एक ubuntu 11.10 आभासी मशीन बनाई गई है और वहाँ से बनाया गया है और Heroku लिए तैनात किए गए, यह कोई पुराना पर्याप्त glibc कि यह Heroku मेजबान पर काम करता है।

संपादित करें: मैं के बाद से Yesod wiki

उत्तर

51

मुझे पता नहीं Yesod है क्या है पर एक ट्यूटोरियल लिखा है, लेकिन मैं जानता हूँ कि बिल्कुल अपने अन्य त्रुटियों में से प्रत्येक के क्या मतलब है।

सबसे पहले, आपको स्थिर रूप से लिंक करने का प्रयास करना चाहिए।चेतावनी आपको मिल बिल्कुल सही है: अगर आप स्थिर लिंक, और दिनचर्या जिसके लिए आप चेतावनी हो रही है में से एक का उपयोग करें, तो आप बिल्कुल libc.so. का एक ही संस्करण के साथ एक सिस्टम पर चलाने के लिए व्यवस्था करना चाहिए 6 जिसे आपने बिल्ड समय पर इस्तेमाल किया था।

लोकप्रिय धारणा के विपरीत, स्थिर लिंकिंग कम, और अधिक नहीं, लिनक्स पर पोर्टेबल निष्पादन योग्य बनाता है।

आपकी अन्य (स्थैतिक) लिंक त्रुटियां लिंक समय पर libopenssl.a गुम होने के कारण होती हैं।

लेकिन मान लें कि आप "सेन" मार्ग पर जा रहे हैं, और गतिशील लिंकिंग का उपयोग कर रहे हैं।

डायनामिक लिंकिंग के लिए, लिनक्स (और अधिकांश अन्य यूनिक्स) पिछड़े संगतता का समर्थन करते हैं: एक पुरानी बाइनरी नई प्रणालियों पर काम करती रही है। लेकिन वे आगे संगतता का समर्थन नहीं करते हैं (एक नई प्रणाली पर निर्मित एक बाइनरी आमतौर पर किसी पुराने पर चलती नहीं है)।

लेकिन आप यही करने की कोशिश कर रहे हैं: आपने glibc-2.14 (या नए) वाले सिस्टम पर बनाया है, और आप glibc-2.13 (या पुराने) वाले सिस्टम पर चल रहे हैं।

दूसरी चीज़ जो आपको जानने की जरूरत है वह यह है कि ग्लिबैक 200+ बाइनरी से बना है जो सभी बिल्कुल से मेल खाना चाहिए। दो प्रमुख बाइनरी /lib/ld-linux.so और /lib/libc.so.6 (लेकिन कई और हैं: libpthread.so.0, libnsl.so.1 इत्यादि)। यदि इनमें से कुछ बाइनरी ग्लिब के विभिन्न संस्करणों से आए हैं, तो आपको आमतौर पर एक क्रैश मिलता है। और यह वही है जो आपने प्राप्त किया था, जब आपने LD_LIBRARY_PATH पर अपने glibc-2.14 libc.so.6 को स्थानांतरित करने का प्रयास किया - यह अब सिस्टम /lib/ld-linux से मेल नहीं खाता है।

तो समाधान क्या हैं? वहाँ कई संभावनाएं (बढ़ती कठिनाई में) कर रहे हैं:

  1. आप लक्ष्य प्रणाली के लिए ld-2.14.so (/lib/ld-linux सिमलिंक का लक्ष्य) नकल कर सकता है, और यह स्पष्ट रूप से आह्वान:

    /path/to/ld-2.14.so --library-path <whatever> /path/to/your/executable 
    

    यह आम तौर पर काम करता है, लेकिन argv[0] पर देखे जाने वाले एप्लिकेशन को भ्रमित कर सकते हैं, और उन अनुप्रयोगों के लिए तोड़ सकते हैं जो स्वयं को फिर से निष्पादित करते हैं।

  2. आप पुराने सिस्टम पर निर्माण कर सकते हैं।

  3. आप appgcc का उपयोग कर सकते हैं (यह विकल्प गायब हो गया है, यह देखने के लिए this देखें)।

  4. आप लक्ष्य प्रणाली से मेल खाते हुए एक क्रोट पर्यावरण स्थापित कर सकते हैं, और उस क्रोट के अंदर निर्माण कर सकते हैं।

  5. आप अपने आप को एक लिनक्स करने वाली olderLinux crosscompiler

+0

ठीक है, इसलिए मैंने अपने सिस्टम से 'libc.so.6' और 'libgmp.so.10' के साथ अपने हेरोकू बिल्ड में' ld-2.14.so' की प्रतिलिपि बनाई है और उसके लिए Heroku रन कमांड को बदल दिया है आपने निर्दिष्ट किया एप्लिकेशन अब चुपचाप दुर्घटनाग्रस्त हो जाता है (कम से कम उसकेोकू लॉग में क्रैश से कोई आउटपुट नहीं होता है, राज्य बस क्रैश होने से शुरू होता है)। यदि मैं 'heroku run चलाता हूं ./lib/ld-linux-x86-64.so.2 --list/path/to/execable' सभी लाइब्रेरी निर्भरता पूर्ण भर चुके हैं, _but_ अधिकांश सिस्टम लाइब्रेरी से संतुष्ट हैं। क्या मुझे अपने सिस्टम से एप्लिकेशन द्वारा उपयोग किए जाने वाले _all_ पुस्तकालयों की प्रतिलिपि बनाना है? – asm

+1

आपको स्थिर रूप से निर्माण करने की आवश्यकता नहीं है; जो मैं समझता हूं, यहां तक ​​कि '-स्टैटिक' और दोस्तों के बिना भी, जीएचसी आपके निष्पादन योग्य (जिसे आपको चाहिए, के साथ जीएचसी आरटीएस को बंडल करेगा, क्योंकि हेरोकू में शायद जीएचसी रनटाइम मुक्ति के रूप में उपलब्ध नहीं है), जब तक कि आप स्पष्ट रूप से संकलित नहीं होते 'गतिशील' ध्वज। डिफ़ॉल्ट रूप से, आरटीएस * द्वारा उपयोग की जाने वाली पुस्तकालयों को गतिशील रूप से पसंद किया जाता है, जो आपके मामले के लिए बुद्धिमान होगा। यह भी देखें: http://stackoverflow.com/questions/699908/making-small-haskell-executables –

+1

मुझे पोस्टिंग के बाद से पता चला। ऐसा लगता है कि प्राथमिक समस्या यह तथ्य है कि मेरा 'libc' हेरोकू होस्ट्स पर क्या है, जैसा कि' नियोजित रूसी 'सुझाव दिया गया है। – asm

5

आपके पास कई मुद्दे हैं बना सकता है।

आपको खून बहने वाले किनारे वितरण पर उत्पादन बाइनरी नहीं बनाना चाहिए। उत्पादन प्रणाली पर पुस्तकालय आगे संगत नहीं होंगे।

आपको ग्लिबैक को स्थिर रूप से लिंक नहीं करना चाहिए - यह हमेशा रनटाइम पर अतिरिक्त पुस्तकालयों को लोड करने का प्रयास करेगा। उदाहरण के लिए सीपीयू-आधारित असेंबली। यही आपकी पहली चेतावनियों के बारे में है।

अंतिम लिंकर त्रुटियां दिखती हैं कि वे कमांड लाइन पर अनुपलब्ध openssl लाइब्रेरी से संबंधित हैं।

लेकिन सभी में - आपके वितरण को डाउनग्रेड करें।

+1

यह देखते हुए कि उसकाोकू अभी भी उस पुराने संस्करण पर है - जो एक स्थिर मंच प्रदान करने के इरादे से समझ में आता है - कोई भी glibcs> 2.11 को शायद "खून बह रहा किनारा" कह सकता है। हालांकि, आपका जवाब दिसम्बर 2011 में समझ में आया होगा। – radiospiel

0

मुझे हेरोकू (जो ग्लिबैक-2.11 का उपयोग करता है) में लॉन्च करने में समान समस्याएं थीं, जहां मेरे पास एक ऐसा एप्लिकेशन था जिसके लिए ग्लिबैक-2.14 की आवश्यकता थी, लेकिन मेरे पास स्रोत तक पहुंच नहीं थी और इसे फिर से नहीं बनाया जा सका। मैंने कई चीजों की कोशिश की और कुछ भी काम नहीं किया।

मेरा कामकाज अमेज़ॅन लोचदार बीनस्टॉक पर सेवा लॉन्च करना था और केवल एक एपीआई इंटरफ़ेस प्रदान करना था।

संबंधित मुद्दे