2011-03-25 16 views
25

का उपयोग कर एक साथ सी और सी ++ फ़ाइलों को संकलित करना मैं जीसीसी का उपयोग करके सी और सी ++ स्रोतों को संकलित करने की कोशिश कर रहा हूं।जीसीसी

gcc -std=c++0x test.cpp -std=c99 test.c -lstdc++

अब, यह ठीक काम करता है, सिवाय इसके कि मैं दो चेतावनी मिलता है।

cc1plus: warning: command line option "-std=c99" is valid for C/ObjC but not for C++ 
cc1: warning: command line option "-std=c++0x" is valid for C++/ObjC++ but not for C 

इसलिए मैं इस सेटअप के साथ -Werror का उपयोग नहीं कर सकता। क्या इन चेतावनियों को किसी भी तरह दबाया जा सकता है?

+0

आप क्या कर रहे हैं _think_ आप जो कर रहे हैं उससे बहुत अलग है। आप पहले भाषा मानक को C++ 0x पर सेट कर रहे हैं और फिर इसे C99 पर सेट कर रहे हैं, जो _both_ फ़ाइलों के लिए केवल C99 का उपयोग करने के बराबर है। हालांकि, सी 99 मोड में सी ++ संकलित करना असंभव है, इसलिए '.cpp' फ़ाइल के लिए, कंपाइलर अपने डिफ़ॉल्ट पर वापस आ जाएगा, जो सी ++ 98 है। इसलिए आप C99 में C फ़ाइल को संकलित कर रहे हैं, और C++ 98 में C++ फ़ाइल को संकलित कर रहे हैं। पार्सिंग विकल्पों के दौरान, जीसीसी देखता है कि आपके पास भाषा संस्करण विकल्प के लिए असंगत फ़ाइलें हैं, इस प्रकार यह प्रत्येक विकल्प के लिए चेतावनियों को आउटपुट करता है। – Damon

उत्तर

40

अलग फ़ाइलों संकलित करें, जी के साथ लिंक ++

gcc -c -std=c99 -o file1.o file1.c 
g++ -c -std=c++0x -o file2.o file2.cpp 
g++ -o myapp file1.o file2.o 
+0

हाँ, यकीन है, लेकिन मुझे इसे एक जीसीसी कॉल में संकलित करने की आवश्यकता है।मैं जीसीसी को कॉल करने के लिए एक एपीआई का उपयोग कर रहा हूं और मैं केवल झंडे जोड़ सकता हूं। –

+0

@Let_Me_Be: फिर आपको या तो एक स्क्रिप्ट/रैपर लिखने की आवश्यकता होगी और उसे कॉल करें, या सी ++ के रूप में सी ++ के रूप में संकलित करें, बिना सी 99 – Erik

+0

हम्म निर्दिष्ट किए बिना, मैं वास्तव में सी ++ भाग को प्रीकंपाइल कर सकता हूं (क्योंकि यह नहीं बदलेगा) :-) –

1

जीसीसी उपयोग जी ++ का उपयोग करने के बजाय यह .cpp और, c फ़ाइलों दोनों के लिए है।

+1

लेकिन 'सी ++' 'सी ++ 'को' सी ++ 'के रूप में संकलित नहीं करेगा? –

+0

संकलन निर्देश देते समय, यदि आप स्पष्ट रूप से .c के रूप में निर्दिष्ट करते हैं, तो मेरे ज्ञान के अनुसार, यह .cpp के रूप में नहीं ले सकता है। लेकिन कृपया इसे किसी ऐसे व्यक्ति के साथ पुष्टि करें जिसका सही ढंग से पता है। – Chaithra

+5

जी ++ के साथ संकलित सी स्रोत फ़ाइलों को सी ++ कोड के रूप में संकलित किया जाएगा। –

2

gcc सी संकलक है और g++ सी ++ संकलक है। आप विभिन्न शैलियों के साथ दो भाषाओं को मिला रहे हैं। अलग संकलित करें और फिर लिंक करें:

gcc -std=c99 -c -o test.c.o test.c 
g++ -std=c++0x -c -o test.cpp.o test.cpp 
g++ -o executable test.cpp.o test.c.o 
+1

आपको अपनी जी ++ संकलन रेखा में अतिरिक्त '=' और '-c' की आवश्यकता है। – Erik

1

यह एंड्रॉइड एनडीके के लिए बहुत प्रासंगिक है। सौभाग्य से, एक बदसूरत कामकाज है। c++0x के रूप में सभी सी c99 के रूप में संकलित फ़ाइलें, और सभी सीपीपी फ़ाइलें बनाने के लिए, फ़ाइल Android.mk निम्न पंक्तियां जोड़ें:

LOCAL_CPPFLAGS += -std=c++0x 
LOCAL_C99_FILES := $(filter %.c, $(LOCAL_SRC_FILES)) 
TARGET-process-src-files-tags += $(call add-src-files-target-cflags, $(LOCAL_C99_FILES), -std=c99) 

यह हाथ-linux-androideabi-4.6 toolchain के साथ नवीनतम NDK r8b में काम करता है, लेकिन मैं गारंटी नहीं दे सकता कि यह भविष्य के संस्करणों में काम करेगा, और मैंने इसे पहले के संस्करणों के साथ परीक्षण नहीं किया था।

14

किसी और का सबसे अच्छा तरीका एंड्रॉयड में यह करने के लिए सोच रहा है, यह इस है:

LOCAL_CFLAGS := -Werror 
LOCAL_CONLYFLAGS := -std=gnu99 
LOCAL_CPPFLAGS := -std=c++0x 
0

मैं भी इस समस्या में पड़ गए। मुझे एक लाइनर के साथ सी और सी ++ को संकलित करने का कोई तरीका नहीं मिला लेकिन ऑटोोटूल ऑटोकॉन्फ़ का उपयोग करके यह प्रत्येक .c और .cpp या .cc के लिए उचित कॉन्फ़िगरेशन और मेकफ़ाइल उत्पन्न करेगा ताकि उन्हें अलग-अलग संकलित किया जा सके और फिर उन्हें लिंक किया जा सके। https://www.gnu.org/software/automake/manual/html_node/Autotools-Introduction.html