2008-10-15 20 views
11

मुझे अपने वर्तमान प्रोजेक्ट के लिए प्रलेखन लिखना आवश्यक है जो सभी .c फ़ाइलों को सूचीबद्ध करता है और प्रत्येक के लिए प्रत्येक .h फ़ाइल सूचीबद्ध करता है जो उस फ़ाइल द्वारा सीधे या परोक्ष रूप से शामिल होता है।स्वचालित रूप से सी निर्भरताओं की खोज

यह एक बड़ी परियोजना है, और यद्यपि हमारे पास मेकफ़ाइल है जो सैद्धांतिक रूप से यह जानकारी है, वे मेकफ़ाइल कभी-कभी गलत होते हैं (हमने इस परियोजना को किसी अन्य कंपनी से विरासत में मिला है)। हमारे परिवर्तनों को वास्तव में पुन: संकलन में प्रतिबिंबित करने के लिए हमें अक्सर make clean ; make करना पड़ता था, इसलिए मैं इन मेकफ़ाइल पर भरोसा नहीं करना चाहता हूं।

तो क्या ऐसा कोई उपकरण है जो हमें इसे एक .c फ़ाइल का नाम देने और पथ शामिल करने देता है और यह हमें उन सभी .h फ़ाइलों को बताता है जो सीधे या अप्रत्यक्ष रूप से .c फ़ाइल द्वारा शामिल हैं? हमारे पास

#define my_include "some_file.h" 
#include my_include 

जैसे अजीब कुछ भी नहीं है, इसलिए उपकरण को सही होने की आवश्यकता नहीं है। कुछ भी जो .c और .h फ़ाइलों को नियमित रूप से शामिल करने के लिए खोजता है, वह पर्याप्त होगा।

उत्तर

14

मैं अपने Makefile में क्या करते

SRCS=$(wildcard *.c) 

depend: $(SRCS) 
    gcc -M $(CFLAGS) $(SRCS) >depend 

include depend 

है इसका मतलब है कि यदि स्रोत फ़ाइलों के किसी भी अपडेट किया जाता है, निर्भर नियम चलेगा, और निर्भर बुलाया फ़ाइल अद्यतन करने के लिए जीसीसी -M का उपयोग करें। इसके बाद मेकफ़ाइल में सभी स्रोत फ़ाइलों के लिए निर्भरता नियम प्रदान करने के लिए शामिल किया गया है।

मेक यह जांच लेंगे कि फ़ाइल शामिल होने से पहले अद्यतित है, इसलिए जब भी आप "निर्भर करें" करने की आवश्यकता के बिना दौड़ते हैं तो यह निर्भर नियम चलाएगा।

यह किसी भी फ़ाइल को बदलने के लिए किसी भी समय चलाएगा। मुझे यह समस्या कभी नहीं मिली है, लेकिन अगर आपके पास निर्देशिका में बड़ी संख्या में फाइलें हैं तो आपको लगता है कि इसमें बहुत अधिक समय लगेगा, इस मामले में आप प्रति स्रोत फ़ाइल पर एक निर्भरता फ़ाइल रखने का प्रयास कर सकते हैं, जैसे:

SRCS=$(wildcard *.c) 
DEPS=$(SRCS:.c=.dep) 

%.dep : %.c 
    gcc -M $(CFLAGS) $< >[email protected] 

include $(DEPS) 

ध्यान दें कि आप सिस्टम हेडर को शामिल करने के लिए -एम के बजाय -एमएम का उपयोग कर सकते हैं।

+0

आप एक अतिरिक्त हैडर, जिससे सभी स्रोत फ़ाइलों का निर्भरता को बदलने शामिल करने के लिए एक हैडर को बदल सकता है, लेकिन अपनी निर्भरता सूची अपडेट नहीं होगा। इसे पूरी तरह से प्राप्त करना काफी स्पष्ट रूप से आईआईआरसी हो सकता है, लेकिन अच्छी शुरुआत है कि आप अपने सभी शीर्षकों को निर्भरता की निर्भरताओं में शामिल करना चाहते हैं। –

+2

ओह, और प्रदर्शन नोट के लिए कि यदि कोई फ़ाइल बदलती है तो यह सभी फ़ाइलों को पुन: संसाधित करती है। तो हो सकता है कि आप एकाधिक निर्भर फाइलें (शायद एक प्रति स्रोत फ़ाइल भी) चाहें।अंत में, ध्यान दें कि आप आम तौर पर -एमएम का उपयोग कर सकते हैं, जो सिस्टम हेडर पर निर्भरता को छोड़ देता है, क्योंकि आप उनको नहीं बदलेंगे। –

+0

असल में मैंने झूठ बोला - मैं हमेशा -एमएम का उपयोग करता हूं :) –

5

"gcc-m file.c" जो आपको चाहिए वह करता है।

1

एमएसवीसी में (2005 और 2008 कम से कम, संभवत: अन्य संस्करणों के साथ-साथ वीसी 6 नहीं) आप संकलन के दौरान शामिल सभी फ़ाइलों को बताने के लिए कंपाइलर प्राप्त कर सकते हैं। आउटपुट काफी वर्बोज़ है, लेकिन मानव आंखों के साथ पार्स करने के लिए पूर्ण और काफी आसान है।

प्रोजेक्ट सेटिंग्स में, सी/सी ++> उन्नत टैब पर जाएं, और "शामिल करें दिखाएं" टॉगल करें, फिर अपनी परियोजना को ग्राउंड अप से पुनर्निर्माण करें।

+0

या कमांड लाइन/मेकफ़ाइल से: -शो शामिल –

4

जीसीसी-एम का एक विकल्प fastdep है। फास्टडेप के लेखक ने फास्टडेप जीसीसी के एमएम की तुलना में दस गुना तेजी से रिपोर्ट की है। यदि परियोजना को बनाने में कुछ समय लगता है, तो फास्टडेप एक लायक हो सकता है।

2

उपयोग SCons

$ scons --tree=all 
scons: Reading SConscript files ... 

scons: done reading SConscript files. 
scons: Building targets ... 
scons: `.' is up to date. 
+-. 
    +-SConstruct 
    +-app 
    | +-test.o 
    | | +-test.c 
    | | +-/include/PCI_1149_1.h 
    | | +-/include/Pci.h 
    | | +-/usr/bin/gcc 
    | +-/usr/bin/gcc 
    | +-/lib/libpci1149_64.a 
    ... 
+0

अच्छा! मैंने वास्तव में स्कॉन्स एपीआई के माध्यम से देखा क्योंकि मुझे लगा कि मुझे इसे करने के लिए अपने आंतरिक के साथ चारों ओर घूमना होगा। मैं इस कमांड लाइन स्विच को भविष्य में दिमाग में रखूंगा। –

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