2012-06-27 22 views
5

समस्या शीर्षक में है, मैं सूची क्या मैं पहले से ही की कोशिश की है और इतने पर नीचे की कोशिश करेंगे का उपयोग कर कार्यक्रम।संकलन सरल स्थिर ओपन 4.0 MinGW, freeglut और Glew

सबसे पहले, मेरी समझ में, क्रम में खिड़कियों पर ओपन 4.0 का उपयोग करने के आप का विस्तार करने और या डिफ़ॉल्ट खिड़कियों पुस्तकालय बाईपास के रूप में यह केवल जहाजों 1.1 ओपन चाहिए।

तो हम MinGW C:/MinGW/ पर स्थापित किया है। इसके बाद मैं project site से tarball डाउनलोड करके FreeGLUT सेटअप करता हूं। निकालें और ./configure आदेश को --prefix की एक छोटी सी अतिरिक्त instructions के अनुसार makefiles चलाकर संकलन।

./configure --prefix=/c/Users/Owner/root/ 
make all 
make install 

अब मैं /c/Users/Owner/root/lib/, /c/Users/Owner/root/include/ और इतने पर में freeglut है। अगली बार GLEW है, मेरी समस्या बच्चा जहां तक ​​मैं कह सकता हूं।

the project site (direct 1.7.0.zip link) से स्रोत संग्रह डाउनलोड करें। संकलन एक ताड़ अधिक जटिल है, मेरा वर्तमान नुस्खा स्टैक ओवरफ्लो प्रश्न "Building glew on windows with mingw" से लिया गया है। एक संक्षिप्त रूप नीचे सूचीबद्ध है:

mkdir lib/ 
mkdir bin/ 
gcc -DGLEW_NO_GLU -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.o -c src/glew.c 
gcc -shared -Wl,-soname,libglew32.dll -Wl,--out-implib,lib/libglew32.dll.a -o lib/glew32.dll src/glew.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32 
ar cr lib/libglew32.a src/glew.o 
gcc -DGLEW_NO_GLU -DGLEW_MX -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.mx.o -c src/glew.c 
gcc -shared -Wl,-soname,libglew32mx.dll -Wl,--out-implib,lib/libglew32mx.dll.a -o lib/glew32mx.dll src/glew.mx.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32 
ar cr lib/libglew32mx.a src/glew.mx.o 

और /path/to/glew-1.7.0/ की "रूट" से चलाया जाना चाहिए।


अब पुस्तकालयों की स्थापना के साथ "हो गया" (कोई गलती मानते हुए ...) मेरे साधारण प्रोग्राम संकलन इस लाइन के साथ किया जाता है।

${G++} -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -lfreeglut_static -lopengl32 -lwinmm -lgdi32 -lglew32 -I ${ROOTPATH}/include -L ${ROOTPATH}/lib --static 

अब इस एक सा विघटित और कारण है कि मैं विभिन्न "अतिरिक्त" तर्क है के माध्यम से चलना है और आप यह जान सकें कि त्रुटियों और समस्याओं मैं पहले से ही में चलाने के लिए और समाधान कर लिया है करने के लिए।

  1. -DFREEGLUT_STATIC और -lfreeglut_static सामान्य -lfreeglut के स्थान पर प्रयोग के रूप में हम एक स्थिर निर्माण यहाँ चाहते हैं। ऐसा करने में विफलता फ्रीग्लट से संबंधित लिंकर त्रुटियां देती है।
  2. -DGLEW_STATIC इसी कारण से जोड़ा गया है। freeglut_init.c:(.text+0x5d9): undefined reference to '[email protected]':
  3. -lwinmm लिंकर त्रुटि को ठीक करने के लिए जोड़ा गया है।
  4. -lgdi32 लिंकर त्रुटि को ठीक करने के लिए जोड़ा जाता है: c:/Users/Owner/root//lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c:(.text+0x58c): undefined reference to '[email protected]'

अब मैं निम्नलिखित लिंकर त्रुटि के साथ स्टम्प्ड हूँ:

c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0x83e8): undefined reference to `[email protected]' 
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa1b2): undefined reference to `[email protected]' 
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa290): undefined reference to `[email protected]' 

न्यूनतम परीक्षण का मामला है कि इस त्रुटि का उत्पादन (main.cpp) है।

#include <GL/glew.h> 
#include <GL/freeglut.h> 

int main(int argc, char **argv) { 
    glEnableVertexAttribArray(0); 
} 

विचार?

+2

अपने प्रोग्राम को संकलित करने के लिए लाइन पर आखिरी बार -lopengl32 जोड़ने का प्रयास करें और देखें कि यह मदद करता है या नहीं। संपादित करें: संभवतः -ffreeglut_static होना चाहिए क्योंकि genpfault कहते हैं, मैं बहुत जल्दी पढ़ता हूं। – Jite

+1

@Jite यह काम करता है! (न्यूनतम परीक्षण मामले पर) ओ.ओ कृपया इसे एक उत्तर दें ताकि मैं इसे ऊपर उठा सकूं और स्वीकार कर सकूं। मुझे विश्वास नहीं है कि मैं जीसीसी के तर्कों के संयोजन को याद करने में कामयाब रहा क्योंकि मैंने 12 अलग-अलग सेटों की कोशिश की है! इससे भी बेहतर अगर आप या कोई अन्य यादृच्छिक रूप से कोशिश करने वाले संयोजनों के अलावा लाइब्रेरी ऑर्डर चुनने के लिए _how_ पर कुछ जानकारी प्रदान कर सकता है। – nixeagle

+0

खुशी है कि यह काम किया! मुझे लगता है कि किसी और को इसे और अधिक गहराई से समझाना होगा, लेकिन जो मैं समझता हूं, मुझे सही करें अगर मैं गलत हूं, तो यह छायांकन के बारे में है, जैसे कि आपके पास दो पुस्तकालय एक ही नाम के साथ एक समारोह को परिभाषित करते हैं, आखिरी एक लिंक खत्म हो जाएगा पहले छाया। – Jite

उत्तर

4

अपने प्रोग्राम को संकलित करने के लिए लाइन पर आखिरी बार -lopengl32 जोड़ने का प्रयास करें और देखें कि यह मदद करता है या नहीं।

1

तर्क आदेश gcc लिंकर विकल्पों के साथ महत्वपूर्ण है।

${G++} -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -I ${ROOTPATH}/include -L ${ROOTPATH}/lib -lopengl32 -lwinmm -lgdi32 -lglew32 -static -lfreeglut_static 

इसके अलावा, मैं वहाँ एक डबल पानी का छींटा --static विकल्प, बस -static है नहीं लगता है:

इस प्रयास करें।

और Win32 पर आपको अपने glEnableVertexAttribArray() फ़ंक्शन पॉइंटर मान्य होने से पहले सफल glewInit() की आवश्यकता होगी। अपने कोर संस्करण और/या एक्सटेंशन को निश्चित रूप से जांचने के बाद :)

+1

जो _wglGetProcAddress @ 4 'के अपरिभाषित संदर्भ के बारे में अधिक शिकायतें जोड़ता है। शायद उल्लेख किया जाना चाहिए कि मैंने तर्क आदेश के साथ खेला है। मेरे पास इस सवाल में तर्क है कि कम से कम जीसीसी स्पैम देता है। – nixeagle

+0

'--static' और '-static' दोनों कामों की तरह लगता है। मैंने '--static' का उपयोग एक लम्बा प्रारूप विकल्प के रूप में किया था। – nixeagle

+1

जहां तक ​​'glewInit() 'चला जाता है, हाँ मुझे पता है। मैंने एक * न्यूनतम * टेस्टकेस लगाया जो लिंकर त्रुटि उत्पन्न करता था। मुझे डर था अगर मैंने सी ++ कोड की 25 या 50 लाइनें रखीं, तो हर कोई कोड पर ध्यान केंद्रित करेगा। लिंकर त्रुटि उत्पन्न करने वाली केवल 6 लाइनों तक इसे कम करके, मुझे लगता है कि एक तेज और अधिक सही प्रतिक्रिया प्राप्त हुई है। वास्तविक कोड बीटीडब्ल्यू लिनक्स पर मेरे लिए ठीक काम करता है;)। वास्तव में मेरी खिड़कियों की समस्या का हल क्या है, जीसीसी तर्क सूची के अंत में '-lopengl32' को ले जा रहा है। जइट के जवाब में प्रश्न के नीचे मेरी टिप्पणियां देखें। – nixeagle