2011-01-23 6 views
6

मैं एक प्रोजेक्ट के प्रारंभिक चरणों में पढ़ रहा हूं (पढ़ा: कल शुरू हुआ), और मैं अपना प्रारंभिक मेकफ़ाइल स्थापित कर रहा हूं। यह बहुत सरल है। यहाँ फ़ाइल की पूरी सामग्री है: मुझे लगता है कि यह है कि मैं विंडोज पर काम कर रहा हूँ उल्लेख करने के लिए महत्वपूर्ण है इस बिंदु परइन g ++ "एकाधिक परिभाषा" त्रुटियों के साथ क्या है?

all: main.o resource.o 
    g++ -o output.exe main.o resource.o 

main.o: main.cpp main.h resource.h 
    g++ -mwindows -o main.o main.cpp 

resource.o: resource.rc 
    windres resource.rc resource.o 

clean: 
    rm *.o 

, तो मैं MinGW जी के साथ या तो PowerShell में यह सब कर रहा हूँ ++ 4.5.2 या अन्यथा सिगविन और जी ++ 3.4.4 के साथ (मैंने दोनों की कोशिश की है, वही त्रुटियां)।

उपरोक्त सभी सूचीबद्ध फ़ाइलों की सामग्री छापे बिना, यह कहने के लिए पर्याप्त है कि main.h में windows.h और resource.h का संदर्भ है, main.cpp में main.h का संदर्भ है और कुछ फ़ंक्शन , सबसे महत्वपूर्ण रूप से एक int WINAPI WinMain (...) फ़ंक्शन और एक LRESULT कॉलबैक WndProc (...) फ़ंक्शन, resource.rc में एक फ़ाइल मेनू के साथ एक साधारण मेनूबार के लिए संसाधन परिभाषा विवरण और एक डमी द्वितीय मेनू के साथ-साथ संदर्भ भी शामिल है resource.h में, और resource.h में resource.rc में उपयोग की गई आईडी के लिए बस परिभाषित विवरण हैं।

अब, मैं संसाधन.आरसी और main.h दोनों को अलग-अलग एक दूसरे से संकलित कर सकता हूं और उन दो अच्छी .o फाइलें प्राप्त कर सकता हूं।

main.o:main.cpp:(.text+0x0): multiple definition of `mainCRTStartup' 
c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../crt2.o:crt1.c:(.text+0x160): first defined here 
main.o:main.cpp:(.text+0x0): multiple definition of `WinMainCRTStartup' 
c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../crt2.o:crt1.c:(.text+0x140): first defined here 
collect2: ld returned 1 exit status 
make: *** [all] Error 1 

ऊपर PowerShell में उत्पन्न होता है: हालांकि, जब मैं उन्हें लिंक और output.exe उत्पादन करने के लिए प्रयास करते हैं, मैं त्रुटियों, मैं सच में समझ में जिनमें से कोई भी के निम्नलिखित डरावना सूची मिलता है। सिग्विन त्रुटियों की एक बहुत ही समान सूची देता है, फिर भी "एकाधिक परिभाषा" बयान के आसपास केंद्रित है। कई परिभाषाएं सी: /mingw/lib/crt2.o में प्रतीत होती हैं, और संभवतः crt1.c नाम की एक और फ़ाइल, जो अधिक उपयोगी प्रतीत होती है क्योंकि स्पष्ट रूप से सी एक .o फ़ाइल से कहीं अधिक मानव पठनीय है, लेकिन मुझे सी: \ MinGW फ़ोल्डर के भीतर कहीं भी उस शीर्षक के साथ कुछ भी नहीं मिल रहा है।

कोई भी दिशा बिल्कुल उपयोगी होगी, क्योंकि इस समय मैं बहुत खो गया हूं।

संपादित करें: main.cpp में केवल # संयुक्त विवरण:

#include "main.h" 

main.h की सामग्री:

#ifndef _MAIN_H_ 
    #define _MAIN_H_ 

    #include <windows.h> 
    #include "resource.h" 

#endif 
+0

शायद यह जहां हेडर शामिल किया जा रहा है main.cpp फ़ाइल के पहले भाग को देखने के लिए मदद मिलेगी। मुझे इस तरह की समस्या याद आ रही है जिसे समझने के द्वारा हल किया गया था कि स्पष्ट रूप से शामिल किए गए शीर्षकों में से एक को अन्य शीर्षलेख फ़ाइल द्वारा निहित रूप से शामिल करने की आवश्यकता है, ताकि '# परिभाषित' सही ढंग से सेट हो। – hardmath

+0

'_MAIN_H_' के साथ अग्रणी अंडरस्कोर का उपयोग न करें।अग्रणी अंडरस्कोर के नाम पुस्तकालयों के लिए आरक्षित हैं। – KitsuneYMG

उत्तर

8

आप को -c दलील मौजूद नहीं कर रहे हैं में int main(int argc, char **argv) को int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) बदलने का प्रयास करें g ++ जब आप .opp फ़ाइल को .o फ़ाइल में संकलित कर रहे हों। जैसा कि अब है, आप किसी अन्य से निष्पादन योग्य बनाने की कोशिश कर रहे हैं।

g++ -mwindows -o main.o main.cpp होना चाहिए g++ -mwindows -c -o main.o main.cpp

इसे करते हैं, चेतावनी झंडे के साथ-साथ जोड़ने के लिए, कम से कम -Wall

+0

अच्छी कॉल, लेकिन इससे मदद नहीं मिली। –

+1

@ केएनबी ने कोशिश करने से पहले 'साफ' किया था? – ssmir

+0

ओह मेरा शब्द। मुझे एक बेवकूफ की तरह महसूस हो रहा है। उसने ऐसा किया तुम दोनों का धन्यवाद। –

0

आप अपने int WINAPI WinMain(...) के मुख्य int main(...) बजाय कॉल करने का प्रयास किया? जहाँ तक मुझे याद है के रूप में अपने स्वयं के MinGW WinMain बुला था मुख्य

[संपादित करें]

है यही कारण है, अपने main.cpp

+0

मैं WinMain तर्कों का संदर्भ कैसे दूंगा? याद रखें कि WinMain इस प्रकार बनाया गया है: int WINAPI WinMain (HINSTANCE HIstance, HINSTANCE HPREVInstance, LPSTR lpCmdLine, int nCmdShow) {...} –

+0

@ केएनबी क्या यह तर्क WinMain में उपयोग किए जा रहे हैं? – ssmir

+0

हां। यह एक साधारण Win32 एपीआई प्रोग्राम है। –