2012-06-18 15 views
8

का उपयोग कर ओएसएक्स पर boost :: program_options के साथ परेशानियों को जोड़ना मुझे बूस्ट 1.4 9 के साथ समस्याओं के कारण मेरे सी ++ प्रोग्राम में लिंकिंग चरण से गुजरने में परेशानी हो रही है। मैंने सी ++ (-std=c++11 -libc=libc++) पर स्विच किया है जो कोड के दूसरे टुकड़े (जो बूस्ट का भी उपयोग करता है) के लिए ठीक काम करता है।एलएलवीएम

brew install boost --universal --with-mpi --with-icu 

मुसीबत boost::program_options साथ शुरू होता है: बूस्ट के साथ homebrew का उपयोग कर स्थापित किया गया था। मैं इस तरह लिंक त्रुटियों मिलती है:

"boost::program_options::validate(boost::any&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, int)", referenced from: 

... etc. ... 

ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

यह एक छोटे से अजीब है, क्योंकि इस्तेमाल किया पुस्तकालय पर एक एनएम कर पता चलता है कि प्रतीक वहाँ प्रतीत होता है:

nm -U /usr/local/lib/libboost_program_options-mt.dylib | grep validate 
0000000000019880 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPSsi 
0000000000019880 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPSsi 
00000000000199e0 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPbi 
00000000000199e0 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPbi 
0000000000019930 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPSsi 
0000000000019930 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPSsi 
0000000000019c70 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPbi 
0000000000019c70 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPbi 

मैं पहले से ही की कोशिश की है स्थापना से पहले CXX और CXX_FLAGS सेट करके जीसीसी की बजाय क्लैंग के साथ बढ़ावा देने के लिए होमब्री को जोड़ना। यकीन नहीं है कि मैं सफल हुआ हालांकि।

पॉइंटर्स की बहुत सराहना की गई।

+0

वही प्रश्न इस प्रकार है: http://stackoverflow.com/questions/8454329/why-cant-clang-with-libc-in-c0x-mode-link-this-boostprogram-options-examp –

उत्तर

8

आपको क्लैंग और std11 झंडे के साथ बढ़ावा देने की आवश्यकता होगी, libC++ लाइब्रेरी ओएसएक्स में स्थापित libstdC++ के साथ बाइनरी संगत नहीं है (जीपीएल 3 में बदलने से पहले जीसीसी का प्रारंभिक संस्करण)। यदि क्लैंग का आपका संस्करण 3.1 या उससे अधिक है तो आप इसका उपयोग कर सकते हैं (अन्यथा पुराने संस्करणों के लिए सी ++ 11 को सी ++ 0x में बदलें)।

./bootstrap.sh 
mkdir build 
sudo ./bjam toolset=clang cxxflags="-std=c++0x -stdlib=libc++" variant=release link=static threading=multi runtime-link=shared --build-dir=Build --layout=system --without-mpi --without-python install --prefix=/usr/local 

आप निश्चित रूप से बदल सकते हैं इनमें से किसी भी रूप में आप

टूलसेट = बजना cxxflags छोड़कर इच्छा = "- एसटीडी = C++ 0x -stdlib = libC++"

यह आपके लिए काम करना चाहिए

+0

हाय, धन्यवाद सूचक। जितना सोचा था। हालांकि, मुझे अब मेरे लिए गतिशील पुस्तकालयों को संकलित करने के लिए बूस्ट नहीं मिल रहा है। मैंने यह कोशिश की: 'sudo ./bjam toolset = clang cxxflags = "- std = C++ 11 -stdlib = libC++" variant = रिलीज लिंक = साझा थ्रेडिंग = बहु रनटाइम-लिंक = साझा --build-dir = Build --layout = system --without-mpi --without-python install --prefix =/usr/local ' लेकिन केवल स्थिर हैं। –

+1

मुझे अंत में बूस्ट के माध्यम से जवाब मिला। बिल्ड-फोरम: http://boost.2283326.n4.nabble.com/Problems-building- बूस्ट-with-clang-toolchain-and-C-11-td4631556.html संक्षेप में: मैं bjam को कॉल करते समय 'linkflags' खो रहा था: ./b2 toolset = clang cxxflags = "- std = C++ 11 -stdlib = libC++" linkflags = "- stdlib = libC++" –

3

मैं मैक ओएस एक्स 10.8.5 पर बूस्ट 1.54 के निर्माण के अपने (मामूली दर्दनाक) अनुभव को एक्सकोड 5.0.0 के साथ क्लैंग 5.0.0 के साथ साझा करना चाहता हूं। यदि आप सी ++ 11 फीचर्स चाहते हैं तो clang++ के साथ संकलित करना और लिंक करना बहुत महत्वपूर्ण है, clang के साथ नहीं।

उदाहरण:

#include <iostream> 
#include <string> 

int main(int argc, char *argv[]) { 
    std::string str = "OK"; 
    std::cout << str << std::endl; 
    return 0; 
} 

निम्न आदेश के साथ बनाया जा सकता है:: निम्नलिखित साधारण प्रोग्राम ले

clang++ -std=c++11 -stdlib=libc++ clangstr.cc -o clangstr

हालांकि, यदि आप ऐसा करें:

clang -std=c++11 -stdlib=libc++ clangstr.cc -o clangstr

तो आपको लिंकर त्रुटियां मिलती हैं। ध्यान दें कि clang मैनपेज कहता है कि भाषा -std= विकल्प द्वारा चुनी गई है, लेकिन यह स्पष्ट रूप से पर्याप्त नहीं है।

सबक यह है कि हमें C12+ 11 समर्थन के साथ बूस्ट संकलित करते समय clang++ का स्पष्ट रूप से उपयोग करने के लिए bjam बताना होगा।

mkdir -p build/clangstage/ 
./b2 -j8 --build-dir=build --stagedir=build/clangstage toolset=clang-11 define=BOOST_SYSTEM_NO_DEPRECATED variant=release threading=multi address-model=64 stage 

यह 64-बिट स्थिर बनाता है:

using clang : 11 
    : "/usr/bin/clang++" 
    : <cxxflags>"-std=c++11 -stdlib=libc++ -ftemplate-depth=512" <linkflags>"-stdlib=libc++" 
    ; 

तब मैं ./b2 clean भाग गया, तो मैं निम्न आदेश के साथ बूस्ट बनाया:

this very useful post के बाद, मैं अपने tools/build/v2/user-config.jam में निम्नलिखित डाल और multithreading समर्थन के साथ गतिशील पुस्तकालयों। यदि आपको एक अलग सेट की आवश्यकता है तो तदनुसार ऊपर दिए गए आदेश को बदलें।