एकाधिक .cpp और .h फ़ाइलों को संकलित करने के लिए G ++ का उपयोग करना


172

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

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

जवाबों:


224

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

अर्थात

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

और इसी तरह।

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


152
आप भी कर सकते हैंg++ *.cpp -o output
rubenvb

7
यह किसी भी तरह एक बुरा अभ्यास है? मैं अपने मेकफाइल में इसका इस्तेमाल करना चाहता हूं।
gabriel_vincent

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

@gabriel_vincent आपको शुरू करने के लिए हाथ से मेकअप नहीं लिखना चाहिए। इसके बजाय CMake की तरह एक उचित बिल्ड सिस्टम का उपयोग करें।
बौम Augen mit

3
@BaummitAugen हाँ, सिवाय इसके कि मैं इस छोटे से 2-फ़ाइल प्रोग्राम को संकलित करना चाहता हूँ जिसे मैंने 14 मिनट में लिखा है, और मैं वास्तव में cmake सेट करने के एक घंटे के बजाय एक मेकफाइल लिखने पर 1 मिनट बिताना पसंद करूँगा।
प्रेज़ेमेक डी

55

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

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

3
ध्यान दें कि यदि आप लिंकिंग चरण में निष्पादन योग्य के नाम को नियंत्रित करना चाहते हैं, तो आप आमतौर पर जो करते हैं:g++ -o my_executable myclass.o main.o
eric

22

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

यदि आप मेकफाइल में डालने जा रहे हैं, तो एक बार में कई फ़ाइलों का संकलन करना एक खराब विकल्प है।

आम तौर पर एक Makefile में ( GNU / Make के लिए ) यह लिखने के लिए पर्याप्त होना चाहिए:

# "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से ठीक से recompiling किया जाएगा जो recompiled करने की आवश्यकता है। हेडर फ़ाइल निर्भरताएँ उत्पन्न करने के लिए कुछ जुड़वाँ जोड़े जा सकते हैं - ताकि हेडर फ़ाइल परिवर्तनों के कारण इसे फिर से बनाया जा सके।


13

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

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

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


12

मुझे पता है कि यह सवाल सालों पहले पूछा गया था लेकिन फिर भी मैं यह साझा करना चाहता था कि मैं आमतौर पर कई सी ++ फाइलें कैसे संकलित करता हूं।

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

बस इतना ही!!

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

ps इस विधि का उपयोग केवल तभी करें जब आप मेकअप के बारे में परवाह नहीं करते हैं।


1
जब मैं इस दृष्टिकोण का उपयोग करता हूं तो पुनर्वितरण त्रुटि उत्पन्न होती है? क्या ऐसा करने का एक और तरीका है?
वसीम अहमद नईम

11

.h फ़ाइलों को संकलन से कोई लेना-देना नहीं होगा ... आप केवल cpp फ़ाइलों की परवाह करते हैं ... इसलिए टाइप करें g++ filename1.cpp filename2.cpp main.cpp -o myprogram

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

फिर अपना प्रोग्राम चलाएं ./myprogram


7

के रूप में rebenvp कहा कि मैं प्रयोग किया है:

g++ *.cpp -o output

और फिर आउटपुट के लिए ऐसा करें:

./output

लेकिन makeफ़ाइल का उपयोग करने के लिए एक बेहतर समाधान है । फ़ाइलों के बारे में अधिक जानने के लिए यहां पढ़ें make

यह भी सुनिश्चित करें कि आपने .hफाइलों में आवश्यक फाइलें जोड़ी हैं .cpp


4

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


2

यदि आप #include <myheader.hpp>अपनी cpp फ़ाइलों का उपयोग करना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

g++ *.cpp -I. -o out

1

मैं एक कस्टम मेकफाइल का उपयोग करता था जो सभी फाइलों को वर्तमान निर्देशिका में संकलित करता था, लेकिन मुझे इसे हर उस निर्देशिका में कॉपी करना था जिसकी मुझे आवश्यकता थी, हर बार।

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


-4

~ / In_ProjectDirectory $ g ++ ordin_main.cpp ordin_func.cpp ordin.h

~ / In_ProjectDirectory $ ./a.out

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

Geany IDE के साथ लिनक्स मिंट का उपयोग करना

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


3
आप डाउनवोट हो रहे हैं क्योंकि आपने h-files को शामिल किया है, जो एक त्रुटि है।
एरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.