2015-09-27 6 views
6

मैं लिनक्स पर एक ओपनजीएल ऐप लिख रहा हूं और मैं आसानी से GLUT का उपयोग कर एक विंडो बना सकता हूं, लेकिन जैसे ही मैं -lGL से भी लिंक करता हूं, मुझे एक सेगफॉल्ट मिलता है। कोई विचार क्या यह कारण होगा?जीएल के खिलाफ बस लिंक क्यों एक segfault का कारण बनता है?

मुझे -Wall के साथ भी कोई कंपाइलर चेतावनियां या त्रुटियां नहीं मिलती हैं। केवल जब मैं प्रोग्राम चलाता हूं तो मुझे एक सेगफॉल्ट देता है।

मैंने कभी भी gdb का उपयोग नहीं किया है, लेकिन क्या यह जानकारी मदद करता है?

(gdb) run 
Starting program: /home/drjrm3/code/dc/c++/dc.exe 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000000000 in ??() 
(gdb) backtrace 
#0 0x0000000000000000 in ??() 
#1 0x00007ffff32e8291 in ??() from /lib/x86_64-linux-gnu/libdl.so.2 
#2 0x00007ffff32e86d7 in ??() from /lib/x86_64-linux-gnu/libdl.so.2 
#3 0x00007ffff32e8198 in dlsym() from /lib/x86_64-linux-gnu/libdl.so.2 
#4 0x00007ffff78ef6be in ??() from /usr/lib/nvidia-340/libGL.so.1 
#5 0x00007ffff78d3516 in ??() from /usr/lib/nvidia-340/libGL.so.1 
#6 0x00007ffff7dea0fd in ??() from /lib64/ld-linux-x86-64.so.2 
#7 0x00007ffff7dea223 in ??() from /lib64/ld-linux-x86-64.so.2 
#8 0x00007ffff7ddb30a in ??() from /lib64/ld-linux-x86-64.so.2 
#9 0x0000000000000001 in ??() 
#10 0x00007fffffffc9f0 in ??() 
#11 0x0000000000000000 in ??() 
(gdb) 

मैं अब एक न्यूनतम उदाहरण के लिए नीचे मिल गया यह मैं अभी भी क्या चल रहा है के बारे में उलझन में हूँ:

#include <cstdio> 
#include <string> 
#include <cstdlib> 
#include <iostream> 
#include <vector> 

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


using namespace std; 


/********************\ 
* Global variables * 
\********************/ 
string fname; 


// gl vars 
int WinWidth = 800; 
int WinHeight = 800; 
int WinPos1 = 400; 
int WinPos2 = 400; 

void gl2Dinit(int argc, char** argv); 

void myInit(); 
void draw(); 
void mouseFunc(int button, int state, int x, int y); 
void keyboardFunc(unsigned char key, int x, int y); 


/****************\ 
* Main routine * 
\****************/ 
int main(int argc, char** argv) { 
    fprintf(stderr, "We got this far ...\n"); 

    return 0; 
} 


void gl2Dinit(int argc, char** argv) { 

    // 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 

    /// define window prorperties 
    glutInitWindowSize(WinWidth, WinHeight); 
    glutInitWindowPosition(WinPos1, WinPos2); 
    glutCreateWindow("Title!"); 

    /// intitialize 
    myInit(); 

    /// callback functions 
    glutDisplayFunc(draw); 
    glutMouseFunc(mouseFunc); 
    glutKeyboardFunc(keyboardFunc); 

    // glut main loop 
    glutMainLoop(); 
} 

void myInit() { 
} 

void draw() { 
} 

void mouseFunc(int button, int state, int x, int y) { 
} 

void keyboardFunc(unsigned char key, int x, int y) { 
} 

मैं g++ -g -o dc.exe xdriver.cpp -I/usr/include/GL -lglut -lGL -DLINUX -Wall साथ संकलन और जब मैं कोड चलाने के लिए, यह कुछ भी नहीं बाहर प्रिंट ... मुझे बस Segmentation fault (core dumped) मिल गया है। मुझे क्या भ्रमित करता है कि यह कुछ भी नहीं कर रहा है लेकिन प्रिंटिंग कर रहा है और फिर छोड़ रहा है ... लेकिन किसी भी तरह से यह segfaults।

जैसे ही मैं -lGL लेता हूं, मैं प्रोग्राम चलाता हूं और यह प्रिंट करता है "हमें यह दूर मिला ..." और फिर बाहर निकलता है।

+2

gdb के तहत अपने कार्यक्रम चलाएं और संकेत मिलता है जहां यह segfaulting है। –

+1

सबसे छोटा स्रोत-कोड उदाहरण क्या है जो आप उत्पादन कर सकते हैं जो '-एलजीएल' के बिना चलता है लेकिन segfaults के साथ? अपनी बिल्ड कमांड लाइन भी शामिल करें। – nobar

+0

@ नोबार - मैं अब तक किसी किस्मत के साथ समस्या को अलग करने के लिए पिछले घंटे के लिए न्यूनतम उदाहरण का पुनर्निर्माण करने की कोशिश कर रहा हूं! मेरा निर्माण कमांड 'g ++ -O2 -o dc.exe xdriver.cpp fio.o glfuns.o -I/usr/include/gL -lglut -lGL -DLINUX -Wall' है। यह भी कुछ भी लायक नहीं है कि यह segfault होता है ** भले ही मैं किसी भी जीएल या जीएलयूटी कार्यों को कॉल नहीं करता **। – drjrm3

उत्तर

0

एक छोटे से ओपनजीएल प्रोग्राम के साथ एक ही समस्या होने के बाद, मुझे एक समाधान here मिला।

सारांश में, केवल संकलक झंडे को -pthread जोड़ने। क्योंकि मैं libpthread कहीं भी उपयोग नहीं कर रहा था इसलिए यह वास्तव में में जुड़े हुए नहीं जा सके थे मेरे लिए काम नहीं किया चाल जी ++ सोच रहा libpthread उपयोग कर रहा था में मजबूर करना था, , और इस तरह मजबूर यह जुड़े होने की, मेरे main.cpp फाइल करने के लिए इस छोटे स्निपेट जोड़कर:

#if defined(__unix__) 

#include <pthread.h> 
void* simpleFunc(void*) { 
    return NULL; 
} 
void forcePThreadLink() { 
    pthread_t t1; 
    pthread_create(&t1, NULL, &simpleFunc, NULL); 
} 

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