2015-12-22 9 views
9
का उपयोग कर

जब मैं जीसीसी उपयोग करते हैं, मैं अपने उबंटू 15.04 पर कार्यक्रम बनाने के लिए इस का उपयोग कर सकते हैं:स्टेटिक लिंक libstdC++ बजना

-static-libgcc -static-libstdc++ 

और संकलित बाइनरी किसी भी बाहरी पैकेज के बिना "स्टॉक" Ubuntu 14.04 पर चला सकते हैं, केवल मानक अपडेट ।

क्या क्लैंग के साथ लाइब्रेरी के इस स्थिर लिंकिंग के साथ संभावना है?

सबसे आम जवाब:

  • परीक्षण ubuntu प्रतिनिधि (ppa:ubuntu-toolchain-r/test)
  • अद्यतन सर्वर का उपयोग कर
  • लक्ष्य सर्वर पर
  • recompile
  • जीसीसी

का उपयोग नहीं करते उपयुक्त नहीं है मेरे लिए।

क्या मैं इसे उबंटू 14.04.3 एलटीएस पर चलाने के लिए क्लैंग के साथ कर सकता हूं?

+0

यह काम नहीं करता है? '-static -lstdC++' – Ashkan

+0

@ आकलन नहीं, दुर्भाग्य से। – vladon

+2

@vladon विकल्प '-static-libgcc -static-libstdC++' clang ++ 3.6 के साथ मेरे साथ ठीक काम करता है। – Danh

उत्तर

11

क्लैंग इस मामले पर जीसीसी के साथ संगत है। मूल रूप से iostream का उपयोग करता है libstdc++ आवश्यकता सुनिश्चित करने के लिए नमस्ते दुनिया कार्यक्रम के लिए (वास्तविक lib संस्करणों वितरण के बीच भिन्न हो सकते हैं):

$ clang++ test.cpp 
$ ldd ./a.out 
     linux-vdso.so.1 (0x00007ffec65c0000) 
     libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libstdc++.so.6 (0x00007ff937bb6000) 
     libm.so.6 => /lib64/libm.so.6 (0x00007ff9378b6000) 
     libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libgcc_s.so.1 (0x00007ff93769e000) 
     libc.so.6 => /lib64/libc.so.6 (0x00007ff9372fe000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007ff937f3e000) 

यहाँ libstdc++ और libgcc_s के लिए एक निर्भरता है। लेकिन तुम -static-libgcc -static-libstdc++ जोड़ते हैं:

$ clang++ test.cpp -static-libgcc -static-libstdc++ 
$ ldd ./a.out 
     linux-vdso.so.1 (0x00007ffe5d678000) 
     libm.so.6 => /lib64/libm.so.6 (0x00007fb8e4516000) 
     libc.so.6 => /lib64/libc.so.6 (0x00007fb8e4176000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007fb8e4816000) 

कि अभी भी libc पर निर्भरता छोड़ देता है, लेकिन यह एक अलग सवाल है।

clang: warning: argument unused during compilation: '-static-libstdc++' का मतलब है कि क्लैंग ने इस ध्वज को अनदेखा किया, क्योंकि ध्वज वर्तमान स्थिति में बेकार है। दिमाग में आने वाले पहले दो उदाहरण सी कोड संकलित कर रहे हैं (जो स्पष्ट रूप से libstdC++ पर निर्भर नहीं है), या लिंक किए बिना संकलन-केवल कमांड जारी करना (-c ध्वज)। चूंकि .o फ़ाइल स्थैतिक या गतिशील लिंकिंग के बारे में जानकारी नहीं रख सकती है, इसलिए इस ध्वज को जोड़ने के चरण पर चेतावनी, केवल से बचने के लिए निर्दिष्ट किया जाना चाहिए)।