2012-10-18 55 views
10

टीएलडीआर में काम करता है: उबंटू डेबियन में सेंटोस रेडहाट में काम करने वाले सी ++ प्रोग्राम को संकलित करने में परेशानी हो रही है। क्या मुझे कुछ भी है जो मुझे इन दोनों के बीच अवगत होना चाहिए जो एक ही संकलक का उपयोग करके संकलित सी ++ प्रोग्राम को काम नहीं करेगा?मैं डेबियन (उबंटू) में एक सी ++ प्रोग्राम चलाने में असमर्थ हूं जो रेडहाट (सेंटोस)

हैलो, मैं संकलित करने और जर्मलाइन (http://www1.cs.columbia.edu/~gusev/germline/) चलाने की कोशिश कर रहा हूं। यह रेडहाट सेंटोस में ठीक काम करता है, लेकिन क्योंकि केंद्रों को उबंटू के रूप में समर्थित नहीं किया जाता है, अधिकांश चीजों के लिए मैंने स्विच किया है। और अब यह कार्यक्रम काम नहीं करता है। यह पूरी तरह से संभव है कि यह किसी प्रकार की रेडहाट केवल कार्यक्षमता का उपयोग कर रहा है, लेकिन मैं इसे एक ही कंपाइलर (जी ++) का उपयोग कर रहा हूं ताकि इसे दोनों वातावरण में संकलित किया जा सके।

मैं अपने बालों को उबंटू पर काम करने की कोशिश कर रहा हूं क्योंकि यह काम करने के लिए बहुत अच्छा है, लेकिन अब जब मैं उबंटू में इस परियोजना को "सब कुछ" बना दूंगा तो यह संकलित होगा और परीक्षण स्पिन (कभी खत्म नहीं) हमेशा के लिए। इससे कोई फर्क नहीं पड़ता कि मैं किस द्विआधारी का उपयोग करता हूं (सेंटो में संकलित और प्रतिलिपि, असफल परीक्षण बाइनरी जो मैंने अभी उल्लेख किया है), कार्यक्रम हमेशा फ्रीज होता है।

किंडा लंबे, क्षमा करें। मेरा मुख्य प्रश्न यह है: क्या कोई अन्य सी ++ कंपाइलर विकल्प मैं कोशिश कर सकता हूं? क्या कोई लाल-टोपी सी ++ पुस्तकालय है जो मुझे याद आ रही है। या उनके सी ++ कार्यान्वयन में प्रमुख मतभेद जो इसका कारण हैं?

+7

आपकी सहायता करने के लिए, आपको कम से कम त्रुटि प्रदान करना होगा जो G ++ कंपाइलर आपको देता है। – Gui13

+0

जब आप कहते हैं 'वही कंपाइलर' क्या आप g ++ के समान संस्करणों का उपयोग कर रहे हैं? आपके कॉन्फ़िगरेशन आउटपुट दोनों मशीनों पर कैसा दिखता है? – PenguinCoder

+0

मेरे पास एक समान मामला है, यद्यपि विंडोज और लिनक्स के साथ। हो सकता है कि आपका कोड सही तरीके से कार्य करने के लिए किसी प्रकार के अपरिभाषित व्यवहार पर भरोसा कर रहा हो और जो भी कारणों से Red Hat Linux पर ही होता है। मेरी सलाह है कि डिबगिंग प्रतीकों के साथ संकलन करना और किसी भी बग को पकड़ने के लिए वालग्रिंड के माध्यम से अपना कोड चलाएं। –

उत्तर

1

आपको यह निर्दिष्ट करना चाहिए कि पहली त्रुटि वास्तव में क्या है, आपने यह कहने के लिए पर्याप्त जानकारी प्रदान नहीं की है कि समस्या क्या है, हालांकि मुझे लगता है कि एक लापता निर्भरता है।

कोई सभ्य पैकेज निर्भरताओं की सूची के साथ आता है, क्या आपने इसके लिए जांच की है और जांच की है?

आवश्यकताओं और निर्भरता सूची की अनुपस्थिति में, इस स्थिति में अंगूठे का एक अच्छा नियम यह जांचना है कि पहली त्रुटि क्या है और इसे ठीक करें। उदाहरण के लिए यदि पहली त्रुटि "अनुपलब्ध foolib.h" कहती है तो आपको उस मशीन के लिए "मूर्ख" स्थापित करने की आवश्यकता है।

1
  1. make all अपने स्वयं के चरण के रूप में करें, फिर जांचें कि सबकुछ ठीक संकलित है।
  2. make tests चलाएं, फिर जांचें कि कौन से परीक्षण विफल हो गए हैं।

ये आपके पहले चरण हैं, और आपको वहां से अधिकतर तरीके मिल सकते हैं।

जैसा कि पेंगुइनकोडर ऊपर बताता है, आपको यह जांचना होगा कि कंपाइलर संस्करण उबंटू और रेडहाट के बीच समान हैं। हर बार gcc में एक बड़ा संस्करण अपग्रेड किया गया है, मेरे पास कुछ (मामूली) समस्याएं हैं।

6

मैंने सॉफ्टवेयर पर एक नज़र डाली। यह इनपुट कोड थोड़ा नाजुक है, और मुझे यकीन नहीं है कि अगर इस मामले में उबंटू या रेड हैट की सी ++ लाइब्रेरी छोटी है, लेकिन प्रोग्राम को दोनों पर काम करने के लिए आसानी से तय किया जा सकता है।

while (!stream.eof()) 

लिए:

फ़ाइल PEDIndividualsExtractor.cpp में, समारोह void PEDIndividuasExtractor::loadInput() में, लाइन बदलने

while (stream) 

और पुनः संकलित करें।

2

while(!stream.eof()) का उपयोग एक आम गलती है। यदि कथन stream.eof() सत्य है, तो यह आवश्यक नहीं है कि स्ट्रीम के साथ अंतिम ऑपरेशन सफल हो।

यहाँ जीएनयू g++4.6 साथ पैकेज संकलित करने के लिए कुछ bash स्क्रिप्ट हैं:

wget http://www1.cs.columbia.edu/~gusev/germline/germline-1-5-1.tar.gz 
tar -xzvf germline-1-5-1.tar.gz 
cd germline-1-5-1/ 
perl -p -i.bak -e's/!stream\.eof\(\)/stream/g' PEDIndividualsExtractor.cpp 
perl -p -i.bak -e's/!stream_sample.eof\(\)/stream_sample/g' HMIndividualsExtractor.cpp 
make all 
cat test/generated.out 
+0

आपकी लिपि शक्तिशाली सुविधाजनक और सहायक थी, धन्यवाद! –

0

आप केवल Ubuntu पर प्रोग्राम का उपयोग करने की जरूरत है, आप इस कार्यक्रम --static के साथ एक स्थिर निष्पादन संकलित करने के लिए कॉन्फ़िगर कर सकते हैं, और फिर निष्पादन योग्य उबंटू को कॉपी करें।

या, आप ldd आदेश का उपयोग कर सकते हैं पता लगाना .so के खिलाफ जुड़ा हुआ गतिशील निष्पादन योग्य फ़ाइलों और गतिशील निष्पादन का एक ही निर्देशिका करने के लिए इन .so फ़ाइलों की प्रतिलिपि, और चलाने के लिए Ubuntu जोड़ देते हैं। आप .so फ़ाइलों को दूसरी निर्देशिका में भी डाल सकते हैं और का उपयोग निष्पादन योग्य .so फ़ाइलों को खोजने में मदद के लिए कर सकते हैं।

+0

ने ऐसा किया, और यहां वह जगह है जहां मुझे मिला: http://unix.stackexchange.com/questions/169754/running-ubuntu-binary-on-centos-with-all-shared-libs-installed-results-in-ld -sig –