2008-09-22 6 views
14

पर एक एसडीएल गेम को स्थिर रूप से संकलित कैसे करें मैं विंडोज़ के लिए अपने गेम के एक स्थिर रूप से जुड़े "सिंगल बाइनरी" संस्करण का उत्पादन करने की कोशिश कर रहा हूं। मैं sdl, sdl_image और sdl_mixer से लिंक करना चाहता हूं जो बदले में कुछ समर्थन पुस्तकालयों में खींच लेता है। दुर्भाग्यवश मुझे साइगविन/मिंगव/जीसीसी का उपयोग करके संकलित करने और लिंक करने के लिए सभी को पाने का कोई तरीका नहीं मिला है। जहां तक ​​मैं सभी मौजूदा सार्वजनिक संस्करणों को बता सकता हूं केवल साझा पुस्तकालय/डीएलएस हैं।विंडोज

कृपया ध्यान दें कि मैं यहां लाइसेंसिंग के बारे में बात नहीं कर रहा हूं। स्रोत खुला होगा इस प्रकार एसडीएल का जीपीएल/एलजीपीएल प्रासंगिक नहीं है।

+0

मैं अपूर्णता के लिए स्वीकार्य उत्तर नहीं बनना चाहता था :(। यदि आप अधिक जानकारी प्रदान कर सकते हैं (जैसे एसडीएल-कॉन्फ़िगर कॉल से आउटपुट और लिंकर त्रुटियों की एक सूची), तो मैं कोशिश करने के लिए तैयार हूं मेरे उत्तर को ठीक करने के लिए। –

+0

एसडीएल - स्टेटिक-लिब रिटर्न: "-एल/​​यूएसआर/स्थानीय/lib -lmingw32 -lSDLmain -lSDL -mno-cygwin -mwindows" जो मुझे सही दिखता है। कोई अन्य जानकारी जो मैं दे सकता हूं आप? – Sec

उत्तर

21

अपनी परियोजना को संकलित करते समय, आपको अपने मेकफ़ाइल में केवल कुछ बदलाव करने की आवश्यकता है।

    sdl-config --libs के बजाय
  • , का उपयोग sdl-config --static-libs
  • चारों ओर के उपयोग उपर्युक्त -Wl,-Bstatic और -Wl,-Bdynamic साथ sdl-config --static-libs। यह जीसीसी को स्थिर लिंकिंग को मजबूर करने के लिए कहता है, लेकिन केवल उनके बीच निर्दिष्ट पुस्तकालयों के लिए।

अपने makefile वर्तमान में लगता है कि यदि:

SDLLIBS=`sdl-config --libs` 

इसे करने के लिए परिवर्तित करें:

SDLLIBS=-Wl,-Bstatic `sdl-config --static-libs` -Wl,-Bdynamic 

ये वास्तव में कर रहे हैं उन्हीं चीज़ों यूनिक्स सिस्टम पर क्या करना चाहिए, लेकिन यह आमतौर पर यूनिक्स-पसंद पर कई त्रुटियों का कारण नहीं बनता है यदि आप सरल -static जीसीसी में ध्वज का उपयोग करते हैं, जैसे कि यह विंडोज पर करता है।

+0

मैं इसे उत्तर के रूप में चिह्नित कर रहा हूं क्योंकि यह सबसे अच्छा जवाब जैसा लगता है। फिर भी मैं इसे काम पर नहीं ला सकता क्योंकि मुझे _waveOutOpen @ 24 या _timeGetTime @ 0 जैसे कार्यों के लिए "अपरिभाषित संदर्भ" का भार मिल रहा है। – Sec

+0

@Sec उन आवश्यकताओं को खींच लिया गया है क्योंकि एसडीएल स्थिर पुस्तकालय उनका उपयोग करता है। डब्ल्यूआईएनएमएम मल्टी-मीडिया लाइब्रेरी और कुछ अन्य लोगों को आपकी लिंक लाइन में जोड़ना होगा। – WhozCraig

0

ऐसा इसलिए है क्योंकि एसडीएल libs एलजीपीएल लाइसेंस के तहत हैं।

यदि आप libs को स्थैतिक लिंक करना चाहते हैं (यदि आप उन्हें पुनः संयोजित करते हैं तो आप ऐसा कर सकते हैं। इसे मेकफ़ाइल में कुछ हैकिंग की आवश्यकता है) आपको कुछ गेम को कुछ संगत ओपन सोर्स लाइसेंस के तहत भी रखना होगा।

एसडीएल-लिब साझा पुस्तकालयों के रूप में आते हैं क्योंकि अधिकांश प्रोग्राम जो उनका उपयोग करते हैं, वे बंद स्रोत हैं। द्विआधारी वितरण एक ऐसे रूप में आता है जिसे अधिकांश लोगों की आवश्यकता होती है।

+1

एलजीपीएल एक बहुत ही अनुमोदित लाइसेंस है और बंद स्रोत ऐप्स में स्थिर समावेशन की अनुमति देता है। यह जीपीएल है जो डीएलएल प्रकार समावेशन को छोड़कर बंद स्रोत ऐप्स में शामिल करने की अनुमति नहीं देता है। – KPexEA

+0

afaik जीपीएल किसी भी तरह के लिंकिंग की अनुमति नहीं देता है बंद स्रोत। एलजीपीएल गतिशील लिंकिंग की अनुमति देता है (उपयोगकर्ता एलजीपीएल कोड को अपडेट/बदलने में सक्षम होना चाहिए)। एलजीपीएल के साथ एक बंद स्रोत में स्टेटिक लिंकिंग ऑफवेयर एक नो-नो है। –

+3

जब तक आप ग्राहकों को एलजीपीएल पुस्तकालयों को फिर से लिंक करने की सुविधा प्रदान करते हैं, तो आप स्थिर रूप से जुड़े बाइनरी प्रदान कर सकते हैं। आपको एलजीपीएल और राज्य भी शामिल करना होगा कि पुस्तकालय का उपयोग इस लाइसेंस के तहत आता है। – Artelius

2

वाया इस SDL mailing list post ऐसा लगता है कि एक SDL-config स्क्रिप्ट है कि आप --static-libs ध्वज के साथ उपयोग कर सकते हैं निर्धारित करने के लिए क्या लिंकर झंडे आप उपयोग करने की आवश्यकता के साथ SDL विकास उपकरण जहाज।

0

अपने सिस्टम (Ubuntu) पर मैं निम्नलिखित झंडे का उपयोग करना होगा:

-Wl,Bstatic -lSDL_image `sdl-config --libs` -lpng12 -lz -ltiff -ljpeg -lasound -laudio -lesd -Wl,-Bdynamic `directfb-config --libs` -lpulse-simple -lcaca -laa -ldl 

एसडीएल, एसडीएल _ छवि, और स्थिर के रूप में उनकी निर्भरता के कई लिंक है। libdl आप स्थिर नहीं चाहते हैं, इसलिए एसडीएल _ छवि का उपयोग करने वाली पूरी तरह से स्थैतिक बाइनरी बनाना एक खराब विचार है। नाड़ी, काका, एए, और सीधा एफबी शायद स्थिर बना दिया जा सकता है। मुझे अभी तक उन्हें समझने के लिए काफी कुछ नहीं मिला है।

1

पर्यावरण: VMWare आभासी मशीन विंडोज 7 x64 और उपकरण के साथ हम देव सी + + 7.4.2.569 निर्माण, complilador जी + + (टीडीएम-1) 4.6.1

एक बार, SDL2-2.0.3 एपीआई के रूप में स्थापित विन्यास देव सी ++ बहुत स्पष्ट नहीं है कि मैंने क्या किया है क्योंकि परंपरा को कमांड लाइन की आवश्यकता है।

पहली समस्या यह है कि विंडोज 7 ने पद्धति को बदल दिया है और वे अपनी गेंद पर जाते हैं।इन्वेंटरी। रेफरी। https://stackoverflow.com/users/464581/cheers-and-hth-alf

पहली बाधा के बाद, SDL_platform.h यह बुरा है, यह एक और है, मुझे याद नहीं है कि मैंने कहां डाउनलोड किया है, लेकिन अगला संकेतित संस्करण में काम नहीं करता है।

हमें निष्पादन योग्य की निर्देशिका में SDL2.h ls रखना होगा।

D:\prg_desa\zsdl2>g++ bar.cpp main.cpp -o pepe1 -ID:\SDL2-2.0.3\i686-w64-mingw32\include\SDL2 -LD:\SDL2-2.0.3\i686-w64-mingw32\lib -lmingw32 -lSDL2main -lSDL2 -mwindow

मैं अंत में संकलित और SDL2 परीक्षण काम करता है।

+0

यहाँ आप के स्रोत हैं: bar.cpp यूनिकोड, #define यूनिकोड, # शामिल , # शामिल , #undef, शामिल नाम स्थान एसटीडी का उपयोग करना; , int wmain (int argc, wchar_t * argv []), {wostringstream text; पाठ << argc-1 << एल "कमांड लाइन तर्क: \ n"; के लिए (int i = 1; i

+0

main.cpp # शामिल # शामिल # शामिल # नाम नामस्थान std का उपयोग कर शामिल करें; int मुख्य (int argc, char * argv []) {SDL_Surface * स्क्रीन; एसडीएल_इवेंट घटना; अगर (SDL_Init (SDL_INIT_VIDEO) == - 1) {SDL_GetError()); वापसी 1;} संदेशबॉक्स (0, टेक्स्ट ("पुलसा एल ओके"), टेक्स्ट ("होला"), MB_SETFOREGROUND); जबकि (SDL_WaitEvent ईवेंट)) {if (event.type == SDL_QUIT) तोड़ें; } एसडीएल_क्यूइट(); वापसी 0;} –