2011-01-15 12 views
6

असफल रहा स्थिर बढ़ावा पुस्तकालयों (के साथ कुछ बहुत ही अजीब समस्या है, के रूप में वसा/सार्वभौमिक (x86/x86_64) पुस्तकालयों संकलित की समस्या हो रही बूस्ट MacPorts से 1.45.0-2) जीसीसी 4.5 के साथ मैक ओएस एक्स 10.6.6 के तहत।मैक ओएस एक्स और स्थिर बढ़ावा libs -> std :: स्ट्रिंग

त्रुटि संदेश

main(78485) malloc: *** error for object 0x1000e0b20: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
[1] 78485 abort (core dumped) 

है और उदाहरण कोड का एक छोटा सा जो इस समस्या को गति प्रदान करेगा:

#define BOOST_FILESYSTEM_VERSION 3 
#include <boost/filesystem.hpp> 
#include <iostream> 

int main (int argc, char **argv) { 
    std::cout << boost::filesystem::current_path().string() << '\n'; 
} 

जब द्विआधारी में स्थिर बढ़ावा पुस्तकालयों को जोड़ने यह समस्या हमेशा होता है। हालांकि गतिशील रूप से लिंक करना ठीक काम करेगा।

इससे भी अधिक जानकारी:

जीसीसी संस्करण का परीक्षण किया/इस्तेमाल किया: एप्पल जीसीसी 4.2.1 (काम करता है/चलाता है), MacPorts जीसीसी 4.5.2 (विफल रहता है)

झंडे का परीक्षण/इस्तेमाल किया: कोई नहीं, -fPIC, -fPIC जी, -fPIC जी -ggdb3 -gdwarf -2 -O0

सांसद जीसीसी के साथ gdb उत्पादन 4.5.2/उपरोक्त में से किसी झंडे:

(gdb) run 
Starting program: /Users/ionic/crashtest/bin/ctest Reading symbols for shared libraries .++++++++++++++++++++++.................................................................................................................. done 
ctest(80366) malloc: *** error for object 0x100fe6b20: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

Program received signal SIGABRT, Aborted. 0x00007fff81a4e616 in __kill() 
(gdb) bt full 
#0 0x00007fff81a4e616 in __kill() No symbol table info available. 
#1 0x00007fff81aeecca in abort() No symbol table info available. 
#2 0x00007fff81a066f5 in free() No symbol table info available. 
#3 0x0000000100f763e9 in std::string::_M_mutate() No symbol table info available. 
#4 0x0000000100f7644c in std::string::_M_replace_safe() No symbol table info available. 
#5 0x0000000100f77edd in std::string::replace() No symbol table info available. 
#6 0x000000010000713d in std::string::_M_rep() at /usr/include/c++/4.2.1/bits/basic_string.h:1412 
     to = (string &) Cannot access memory at address 0x0 

ऐसा लगता है कि यह ऐप्पल (काफी पुराना) जीसीसी संस्करण के साथ ठीक काम कर रहा है, लेकिन मैकपॉर्ट्स द्वारा नए जीसीसी निर्माण के साथ बुरी तरह विफल रहा है।

otool एल ctest:

./../../bin/ctest: 
     /opt/local/lib/gcc45/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.14.0) 
     /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 625.0.0) 
     /opt/local/lib/gcc45/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1) 

मैं जीसीसी 4.2 और _GLIBCXX_DEBUG मैक्रो सेट के साथ काफी समान ओएस एक्स बग के लिए विभिन्न रिपोर्टों को देखा है, लेकिन यह एक और भी अधिक सामान्य लगता है, के रूप में मैं न तो एक्सकोड का उपयोग कर रहा हूं, न ही मैक्रो सेट कर रहा हूं (यहां तक ​​कि इसे परिभाषित करने में भी मदद नहीं करता है। मैंने यह सुनिश्चित करने की कोशिश की कि यह वास्तव में इस समस्या से संबंधित नहीं है।) इस समस्या से संबंधित नहीं लगता है, ऐप्पल के जीसीसी के साथ एक ही कोड ठीक काम कर रहा है।

एप्पल जीसीसी शामिल नहीं है के रूप में किसी भी C++ 0x अभी तक सुविधाओं, मैं वास्तव में वर्तमान में स्थिर जीसीसी संस्करण का उपयोग करना चाहते हैं।

किसी को यह क्यों हो रहा है के लिए किसी भी संकेत दिए गए या यहाँ तक कि शायद एक समाधान (बजाय गतिशील पुस्तकालय वैकल्पिक हल का उपयोग) है?

सादर,

मिहाई

+0

बढ़ावा का कौन सा संस्करण? –

+0

मैंने पोस्ट को थोड़ा सा अपडेट किया है और ब्रांड को नई महत्वपूर्ण जानकारी जोड़ दी है। :) – Ionic

+0

बूस्ट संकलित करने के लिए जीसीसी और libstdC++ के कौन से संस्करणों का उपयोग किया गया था? अगर ऐप्पल द्वारा प्रदान किया गया है, तो मुझे लगता है कि मैकपॉर्ट्स से जीसीसी के साथ बाइनरी-संगत नहीं है। – leedm777

उत्तर

7

समस्या यह है कि बूस्ट, एप्पल के जीसीसी 4.2.1 का उपयोग कर, जबकि मैं एक अलग संकलक का उपयोग कर परियोजना का निर्माण किया गया है निर्माण किया गया है था।

मैं स्थिर बूस्ट पुस्तकालयों जोड़ने की कोशिश की के रूप में, यह भी जीसीसी 4.2.1 libstdC++ बाइनरी में डाल दिया गया था। हालांकि, साथ ही अन्य जीसीसी संस्करण अपने libstdC++ में लिंक कर रहा था और नाम अंतरिक्ष समस्याएं निहित थीं, इस प्रकार गलत कार्यों को बुलाया गया था और इसी तरह।

अपने लक्ष्य जीसीसी संस्करण के साथ सबसे सरल ठीक है फिर से निर्माण बूस्ट और अपने कार्यक्रम के निर्माण (ओएफसी पुनः प्रयास करें। स्वयं बनाया बूस्ट का उपयोग कर।)

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

+0

आप देख सकते हैं कि ओटोल दिखाता है कि यह libstdC++ का उपयोग कर रहा है/सिस्टम को विस्तृत नहीं करता है। – ismail

+0

हाय दोस्तों। मैं मैक ओएस 10.6.6 डेस्कटॉप पर चल रहे जीसीसी 4.5.2 का नवीनतम स्थिर निर्माण प्राप्त करने की कोशिश कर रहा हूं। नवीनतम मैक ओएस एक्स रिलीज के लिए जीसीसी बनाने के बारे में जानकारी दुर्लभ है (जीसीसी पेज 10.5 के लिए सफलता की सूची है)। क्या मैकपॉर्ट्स जाने का रास्ता है? धन्यवाद! –

+0

हां, नए जीसीसी रिलीज को संकलित और स्थापित करने के लिए बस मैकपॉर्ट्स का उपयोग करें। वे सभी ऐप्पल एक्सटेंशन याद करेंगे, लेकिन अन्यथा ठीक काम करते हैं। – Ionic