2010-07-08 12 views
97

मुझे अभी कुछ सी ++ कोड विरासत में मिला है जो एक सीपीपी फ़ाइल के साथ खराब रूप से लिखा गया था जिसमें मुख्य और अन्य कार्यों का समूह था। .h फ़ाइलें भी हैं जिनमें कक्षाएं और उनकी कार्य परिभाषाएं शामिल हैं।एकाधिक .cpp और .h फ़ाइलों को संकलित करने के लिए G ++ का उपयोग

अब तक प्रोग्राम g++ main.cpp कमांड का उपयोग करके संकलित किया गया था। अब मैंने वर्गों को .h और .cpp फ़ाइलों को अलग कर दिया है, क्या मुझे मेकफ़ाइल का उपयोग करने की आवश्यकता है या क्या मैं अभी भी g++ main.cpp कमांड का उपयोग कर सकता हूं?

उत्तर

135

main.cpp के बाद अन्य सभी सीपीपी फ़ाइलों को सूचीबद्ध करें।

यानी

g++ main.cpp other.cpp etc.cpp 

और इतने पर।

या आप उन्हें सभी को संकलित कर सकते हैं। फिर आप सभी परिणामी ".o" फ़ाइलों को एक साथ जोड़ते हैं।

+89

आप 'g ++ * .cpp -o output' – rubenvb

+6

भी कर सकते हैं क्या यह किसी भी तरह का बुरा अभ्यास है? मैं इसे अपने मेकफ़ाइल में उपयोग करना चाहता हूं। –

+6

@gabriel_vincent, यह आवश्यक रूप से खराब अभ्यास नहीं है, लेकिन इसका मतलब यह होगा कि सैकड़ों प्रोजेक्ट में एक फ़ाइल को संपादित करने से संकलक सभी फ़ाइलों के लिए सभी कार्यों को फिर से शुरू कर देगा। अलग से संकलन वृद्धिशील संकलन के लिए अनुमति देता है। –

7

तुम अब भी जी ++ सीधे अगर आप चाहते हैं का उपयोग कर सकते हैं:

g++ f1.cpp f2.cpp main.cpp 

जहां f1.cpp और f2.cpp उन में कार्यों के साथ फ़ाइलें हैं। निर्माण करने के लिए उपयोग करने के तरीके के विवरण के लिए, उत्कृष्ट GNU make documentation देखें।

3

आप कई g ++ कमांड का उपयोग कर सकते हैं और फिर लिंक कर सकते हैं, लेकिन पारंपरिक मेकफ़ाइल या कुछ अन्य बिल्ड सिस्टम का उपयोग करना सबसे आसान है: जैसे स्कोन (जो मेकफ़ाइल से सेट करना अक्सर आसान होता है)।

16

अब मैंने कक्षाओं को .h और .cpp फ़ाइलों में अलग कर दिया है, क्या मुझे मेकफ़ाइल का उपयोग करने की आवश्यकता है या क्या मैं अभी भी "g ++ main.cpp" कमांड का उपयोग कर सकता हूं?

एक साथ कई फाइलों को संकलित करना एक खराब विकल्प है यदि आप इसे मेकफ़ाइल में डाल रहे हैं। ठीक से recompiling केवल क्या कंपाइल करने की आवश्यकता है होगा

# "all" is name of the default target, running "make" without params would use it 
all: executable1 

# for C++, replace CC (c compiler) with CXX (c++ compiler) which is used as default linker 
CC=$(CXX) 

# tell which files should be used, .cpp -> .o make would do automatically 
executable1: file1.o file2.o 

इस तरह make:

एक Makefile ( GNU/Make के लिए) में आम तौर पर

यह है कि लिखने के लिए पर्याप्त होना चाहिए। कोई भी हेडर फ़ाइल निर्भरताओं को उत्पन्न करने के लिए कुछ बदलाव जोड़ सकता है - ताकि हेडर फ़ाइल में बदलावों के कारण पुनर्निर्माण की आवश्यकता को ठीक से पुनर्निर्माण भी किया जा सके।

2

ज फ़ाइलें कुछ भी नहीं संकलन ... आप केवल cpp फ़ाइलें के बारे में परवाह के साथ क्या करना होगा ... तो टाइप जी ++ filename1.cpp filename2.cpp main.cpp -ओ MyProgram

मतलब है कि आप प्रत्येक सीपीपी संकलन कर रहे हैं फाइलें और फिर उन्हें एक साथ myprgram में जोड़ा।

तो अपने कार्यक्रम ./myprogram

0

मुझे लगता है कि मौजूदा निर्देशिका में सभी फ़ाइलों को संकलित एक कस्टम Makefile का उपयोग करते थे चलाते हैं, लेकिन मैं हर निर्देशिका मैं इसे जरूरत है, हर में इसे कॉपी करना पड़ा।

इसलिए मैंने अपना स्वयं का टूल बनाया - Universal Compiler जिसने कई फ़ाइलों को संकलित करते समय प्रक्रिया को अधिक आसान बना दिया।

28

जोड़ने आप -c विकल्प जोड़ने की जरूरत के बिना अलग से संकलन करने के लिए:

g++ -c myclass.cpp 
    g++ -c main.cpp 
    g++ myclass.o main.o 
    ./a.out 
+0

नोट करें कि आप लिंकिंग चरण में निष्पादन योग्य के नाम को नियंत्रित करना चाहते हैं, बस आप जो करते हैं वह करें: 'g ++ -o my_executable myclass.o main.o' – neuronet

3

मैं इस सवाल का साल पहले कहा गया है, लेकिन अभी भी साझा करने के लिए कैसे मैं आम तौर पर कई C++ फ़ाइलों को संकलित करना चाहता था पता है।

  1. मान लीजिए कि आप 5 cpp फ़ाइलें चलो, तुम सब करने की ज़रूरत के बजाय टाइपिंग प्रत्येक सीपीपी फ़ाइलों का नाम के * का उपयोग है उदा जी ++ -c * सीपीपी -ओ MyProgram।
  2. यह "MyProgram" उत्पन्न होगा
  3. कार्यक्रम ./myprogram

सब है कि चलाने !!

कारण मैं उपयोग कर रहा हूं * यह है कि यदि आपके पास 30 सीपीपी फाइलें हैं तो आप उन सभी को टाइप करेंगे? या बस * चिह्न का उपयोग करें और समय बचाएं :)

p.s केवल इस विधि का उपयोग करें यदि आपको मेकफ़ाइल की परवाह नहीं है।

+0

जब मैं इस दृष्टिकोण का उपयोग करता हूं तो Redefinition त्रुटि उत्पन्न होती है? क्या ऐसा करने का दूसरा तरीका है? –

-3

~/In_ProjectDirectory $ जी ++ coordin_main.cpp coordin_func.cpp coordin.h

~/In_ProjectDirectory $ ./a.out

... काम किया !!

Geany आईडीई

साथ लिनक्स टकसाल का उपयोग करते हुए जब मैं एक ही निर्देशिका के लिए प्रत्येक फाइल सेव, एक फाइल निर्देशिका के भीतर सही ढंग से सहेजा नहीं गया था; coordin.h फ़ाइल। तो, पुनः जांच की गई और इसे coordin.h के रूप में सहेजा गया था, और गलत तरीके से -> coordin.h.gch के रूप में नहीं। छोटी चीजें Arg !!

+0

आप डाउनवॉटेड हो रहे हैं क्योंकि आपने एच-फाइलें शामिल की हैं, जो एक त्रुटि है। – neuronet

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