2014-09-23 7 views
6

जीसीसी में, मैं परिपत्र निर्भरताओं वाले पुस्तकालयों के साथ लिंकिंग समस्याओं को हल करने के लिए लिंकर झंडे -Wl,--start-group और -Wl,--end-group का उपयोग कर सकता हूं। मैं क्लैंग के साथ ऐसा करना चाहता हूं, लेकिन ऐसा लगता है कि यह सुविधा dropped in lld version 3.2 थी। मैं यह कैसे करुं?ऑर्डर से स्वतंत्र क्लैंग के साथ स्थिर पुस्तकालयों को जोड़ना

+5

https://en.wikipedia.org/wiki/Technical_debt –

+0

सभी libs (किसी भी क्रम में) दो बार सूचीबद्ध करें: '-la -lb ...- lx -la -lb ... -lx' (सर्वोत्तम एक स्क्रिप्ट के साथ किया गया) – mlvljr

+0

@mlvljr यह पर्याप्त हो सकता है या नहीं भी हो सकता है। – user1225999

उत्तर

4

LLVM 3.2 राज्य कि

LLVM-ld और LLVM-ठूंठ हटा दिया गया है की release notes, LLVM-ld कार्यक्षमता आंशिक रूप से LLVM-लिंक से बदला जा सकता है | ऑप्ट | {llc | के रूप में, llc -filetype = obj} | एलडी, या पूरी तरह से Clang द्वारा प्रतिस्थापित किया गया।

डिफ़ॉल्ट क्लैंग सिस्टम लिंकर का उपयोग करने लगता है। स्टार्ट-समूह और -Wl, - - अंत समूह जीसीसी के साथ के रूप में

$ clang --version 
clang version 3.2 (branches/release_32 170558) 
... 
$ clang -Wl,--verbose 
GNU ld (GNU Binutils; devel:gcc/openSUSE_12.3) 2.24.0.20140403-196 
... 

यह पता चलता है कि आप -Wl उपयोग कर सकते हैं,: यह यह जीएनयू ld का उपयोग करता है, उदाहरण के लिए लिनक्स पर है।

+0

यह मामला है। ऐप्पल का एलडी उपकरण --स्टार्ट-समूह झंडे का समर्थन नहीं करता है, लेकिन यह परिपत्र निर्भरताओं के बारे में भी परवाह नहीं करता है। – Mokosha

3

मैं परिपत्र निर्भरताओं का प्रशंसक नहीं हूं :) लेकिन here कुछ कहते हैं कि वे कुछ पुस्तकालयों को दो बार जोड़कर इन मामलों को संभालते हैं। मैंने कोशिश नहीं की है लेकिन यह आपके कोड के पदचिह्न को बढ़ा सकता है।

$(CC) -o myApp -lfoo -lbar -lfoo 

मुझे नहीं पता कि यह क्लैंग के साथ काम करता है लेकिन यह एक शॉट के लायक हो सकता है।

बेस्ट समाधान परिपत्र निर्भरता को दूर किया जा के रूप में यह आप भविष्य में और अधिक समस्याएं उत्पन्न होगा होगा।

+0

कोड आकार को कभी भी बढ़ाना नहीं चाहिए :) – mlvljr

0

मुझे एक क्यूटी सी ++ प्रोजेक्ट का उपयोग कर एक कस्टम क्लैंग कंपाइलर से जोड़ने में एक ही समस्या थी।

समस्या पता चला कि क्यूटी बजना (ग संकलक) का उपयोग किया गया था बल्कि बजना से होने की ++ (ग ++ संकलक)। QT परियोजना (QMAKE_CXX = clang ++ सेटिंग) में क्लैंग के बजाय कंपाइलर को क्लैंग ++ के रूप में परिभाषित करके परियोजना सफलतापूर्वक लिंक की गई है।

जैसा कि मैं इसे समझता हूं, वही जीसीसी और जी ++ के लिए सच है।

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