2010-05-02 12 views
8

मैं tuto अनुसरण कर रहा हूं:सेमेक में जीसीसी के -विंडोज़ विकल्प के बराबर क्या है?

http://zetcode.com/tutorials/gtktutorial/firstprograms/

यह काम करता है लेकिन हर बार मैं दोगुना निष्पादन पर क्लिक करें, वहाँ एक सांत्वना जो मैं नहीं है यह वहाँ चाहते हैं।

मैं उस कंसोल से कैसे छुटकारा पा सकता हूं?

मैं इस कोशिश की:

add_executable(Cmd WIN32 cmd.c) 

लेकिन इस गंभीर त्रुटि है: जीसीसी का उपयोग कर

MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol [email protected] referenced in function ___tmainCRTStartup 
Cmd.exe : fatal error LNK1120: 1 unresolved externals 

जबकि सीधे काम करता है:

gcc -o Cmd cmd.c -mwindows .. 

मेरा अनुमान है कि यह करने के लिए कुछ न कुछ है प्रवेश समारोह के साथ: int main(int argc, char *argv[]), लेकिन जीसीसी क्यों काम करता है?

मैं इसे cmake के साथ कैसे काम कर सकता हूं?

अद्यतन

मुझे सुविधा के लिए यहां स्रोत कोड पेस्ट करते हैं:

#include <gtk/gtk.h> 

int main(int argc, char *argv[]) 
{ 
    GtkWidget *window; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_widget_show(window); 

    gtk_main(); 

    return 0; 
} 

UPDATE2

क्यों gcc -mwindows काम करता है लेकिन add_executable(Cmd WIN32 cmd.c) नहीं?

शायद यह -mwindows के लिए cmake में समकक्ष नहीं है?

उत्तर

2

यदि आप चाहते हैं कि आपका प्रोग्राम कंसोल मोड (यानी main फ़ंक्शन) में चलाना है, तो आपको इसे एमएसवीसी में अपने प्रोजेक्ट के गुणों में निर्दिष्ट करना होगा। आप अभी क्या उपयोग कर रहे हैं विंडो विंडो में एक प्रोजेक्ट है (यानी WinMain फ़ंक्शन, जो आपके पास नहीं है, इसलिए त्रुटि है)।

लेकिन यदि आप बदसूरत कंसोल विंडो नहीं प्राप्त करना चाहते हैं, तो आप विंडो मोड का उपयोग करना चाहते हैं (यानी अपने main फ़ंक्शन को प्रोपर WinMain फ़ंक्शन में बदलें)। इस तरह आपकी सामान्य खिड़की सब कुछ दिखाएगी।

संपादित करें: एक तरफ के रूप में, आपको वास्तव में अपने प्रोग्राम "cmd" का नाम नहीं देना चाहिए, यह विंडोज़ कमांड दुभाषिया का नाम है।

+0

लेकिन मैं 'मुख्य' के साथ एक खिड़की कार्यक्रम बनाने के लिए जीसीसी का उपयोग कर सकता हूं, क्यों नहीं 'cmake'? बीटीडब्लू, क्या आप विस्तारित कर सकते हैं कि एक प्रोपर 'विनमेन' फ़ंक्शन क्या है? मैंने 'मुख्य' को 'WinMain' में बदलने की कोशिश की है लेकिन अभी भी काम नहीं कर रहा है। – Gtker

+0

'int main (int, char **)' प्रविष्टि बिंदु का कंसोल संस्करण है। 'int WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int) 'प्रविष्टि बिंदु का विंडो संस्करण है। – Blindy

+0

आपके पहले प्रश्न के बारे में, सेमेक ठीक वही करता है जो आप इसे करने के लिए कहते हैं। आपको नहीं पूछना चाहिए "क्यों नहीं ले सकता?", आपको पूछना चाहिए "मैं क्यों सेमेक को नहीं बता सकता ...?"। – Blindy

1

CMake documentation for using the WIN32 flag with ADD_EXECUTABLE के अनुसार:

When this property is set to true the executable when linked on Windows will be created with a WinMain() entry point instead of of just main().This makes it a GUI executable instead of a console application. See the CMAKE_MFC_FLAG variable documentation to configure use of MFC for WinMain executables.

हालांकि, अपने कार्यक्रम के प्रवेश बिंदु main() और नहीं WinMain() है। इसके बजाय आपको क्या करना चाहिए, WIN32 ध्वज को छोड़ दें, लेकिन आपको libgtk के खिलाफ लिंक करने की आवश्यकता है। तो, आप TARGET_LINK_LIBRARIES का प्रयोग करेंगे:

FIND_PACKAGE(GTK2 2.6 REQUIRED gtk) 
INCLUDE_DIRECTORIES(${GTK2_INCLUDE_DIRS}) 
LINK_DIRECTORIES(${GTK2_LIBRARIES}) 
ADD_EXECUTABLE(myprogramname source1 source2 ... sourceN) 
TARGET_LINK_LIBRARIES(myprogramname ${GTK2_LIBRARIES}) 
+0

धन्यवाद। मैंने आपके 2 समाधानों की कोशिश की है, लेकिन कोई भी काम नहीं करता है। पहले अभी भी एक कंसोल उत्पन्न करता है, और दूसरी रिपोर्ट: 'सीएल: कमांड लाइन चेतावनी डी 9 002: अज्ञात विकल्प को अनदेखा कर रहा है '-मिविंडोज़' – Gtker

+0

@ माइकल हारून सफान, मैं ऊपर दिए गए कोड को चिपकाया है, क्या आप एक नज़र डाल सकते हैं? – Gtker

+0

@Runner, क्षमा करें, लेकिन मेरे पास विंडोज़ की प्रतिलिपि नहीं है जिस पर परीक्षण करने के लिए ... मैं सीएमके से परिचित हूं, लेकिन विंडोज के साथ इतना नहीं। शायद अगर आप मुझे "-विंडोज़" ध्वज के लिए दस्तावेज दिखा सकते हैं, हालांकि, मैं सीएमके समकक्ष को समझने में सक्षम हो सकता हूं। –

4

add_executable (Cmd WIN32 cmd.c)

बताता है CMake यह एक Windows प्रोग्राम है, और यह मुख्य करने के बजाय WinMain के लिए लग रहा है।यदि आप इस्तेमाल किए जा रहे झंडे देखना चाहते हैं तो आप VERBOSE = 1 बना सकते हैं। प्रश्न यह हो सकता है कि आप gtk ऐप्स के लिए WinMain को कैसे परिभाषित करते हैं? मैं क्यूटी के साथ जानता हूं, आप एक पुस्तकालय में लिंक करते हैं जो इसे आपके लिए परिभाषित करता है।

+0

मैं अपना लक्ष्य प्राप्त करना चाहता हूं 'सीएमके' को 'मुख्य 'को' विनमेन 'में बदलने के बिना,' gcc -mwindows 'की तरह। – Gtker

2

आप एक main() प्रवेश बिंदु और कोई सांत्वना के लिए इन लिंकर झंडे सेट कर सकते हैं:

SET(CMAKE_EXE_LINKER_FLAGS 
    "${CMAKE_EXE_LINKER_FLAGS} /subsystem:windows /ENTRY:mainCRTStartup") 

अधिक जानकारी के लिए, कैसे cmake में झंडे सेट करने के लिए के लिए लिंकर झंडे के लिए this answer, और this answer देखते हैं।

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