2011-05-04 4 views
21

मैं मध्य आकार के सी/सी ++ प्रोजेक्ट पर काम करता हूं जिसमें मैंने पहले से ही डॉक्सिजन + ग्राफविज़ लागू किया है। इसके हेडर ग्राफ उपयोगी हैं, लेकिन वे केवल #include के आधार पर संबंध दिखाते हैं। मुझे एक (अधिमानतः लिनक्स-आधारित) उपकरण खोजने में दिलचस्पी है जो फ़ाइल निर्भरताओं का विश्लेषण करता है न केवल #include पर, बल्कि वास्तविक प्रतीक उपयोग पर आधारित है। उदाहरण के लिए, ऐसा टूल न केवल दिखाएगा कि a.cpp में b.h शामिल है, लेकिन a.cppSomeClass का उपयोग करता है जो c.h में b.h द्वारा घोषित किया गया है। यह हेडर को सुझाव देने में भी सक्षम होगा कि इसमें कटौती की जा सकती है।"दीप" हेडर निर्भरता विश्लेषण

उत्तर

18

मैंने बहुत अच्छे परिणामों के साथ Include What You Use का उपयोग किया है। यह सी ++ कोड को पार्स करने के लिए क्लैंग का उपयोग करता है और हटाने के लिए आगे की घोषणाओं और हेडर फ़ाइलों को सुझाव देता है।

एक दोष यह है कि यह आपके कोड के लेआउट के बारे में धारणा करता है - मूल रूप से Google कोडिंग मानकों। तो अगर आपको SomeClass.cpp नामक फ़ाइल है तो यह केवल SomeFile.h देखेंगे। इसके अलावा सुझाव दिया गया है कि आपकी परियोजना की जड़ से पूर्ण पथ का उपयोग करें (#include "SomeClass.h" के बजाय)। अंत में मैंने इस संविधान में अपना कोड बदल दिया, वैसे भी यह अस्पष्टता से बचाता है, लेकिन यदि आप इसे आजमाते हैं तो इसे एक सिर की जरूरत होती है।

आमतौर पर आप केवल CC=include-what-you-use सेट कर सकते हैं और परिणाम प्राप्त करने के लिए पुनर्निर्माण कर सकते हैं - यह -I विश्लेषण के लिए सभी क्लैंग मशीनरी का उपयोग करता है। एक पायथन प्रोग्राम है जो आपके # अंतर्निहित लाइनों को स्वचालित रूप से अपडेट करने के लिए परिणाम का उपयोग करता है।

संपादित करें:

एक अन्य उपकरण है कि के रूप में परिष्कृत नहीं है, लेकिन स्थापित करने के लिए सरल है और दूर करने के लिए #include रों सुझाव दे सकते हैं deheader है। यह आपकी सी ++ फ़ाइल को एक अस्थायी स्थान पर कॉपी करके, #include को हटाने और पुन: संकलित करने के द्वारा काम करता है। अगर रीकंपाइल काम करता है, तो उस हेडर फ़ाइल को निकालना सुरक्षित है। यह क्या नहीं करेगा आगे की घोषणाओं या कुछ भी फैंसी का सुझाव है, लेकिन यह आपकी कार्यान्वयन फाइलों में अनगिनत लाइनों को शामिल कर सकता है।

+0

ऐसा लगता है कि यह एक वास्तविक दर्द है कि इसमें स्थापित करने के लिए कोई द्विआधारी नहीं है। और जब मैंने llvm संकलन करना शुरू किया, तो उसने अपनी हार्ड ड्राइव क्षमता तक भर दी। – Reinderien

+0

@ रिइंडरियन एक चेकआउट और llvm + clang का निर्माण "केवल" 1 जीबी के आसपास है, कॉन्फ़िगर स्क्रिप्ट को अनुकूलित करने योग्य-अनुकूलित करने के लिए याद रखें। एक डीबग बिल्ड आपको 4 जीबी के आसपास वापस सेट करेगा। – richq

+0

मैं अंत में IWYU बनाने में सक्षम था - और हाँ, यह भारी, ब्लोटी आदि है, लेकिन यह कुछ भी नहीं है। मैं भी डेहेडर पर एक नज़र डालेगा। धन्यवाद – Reinderien