मैं लिनक्स पर एक ओपनजीएल ऐप लिख रहा हूं और मैं आसानी से 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
लेता हूं, मैं प्रोग्राम चलाता हूं और यह प्रिंट करता है "हमें यह दूर मिला ..." और फिर बाहर निकलता है।
gdb के तहत अपने कार्यक्रम चलाएं और संकेत मिलता है जहां यह segfaulting है। –
सबसे छोटा स्रोत-कोड उदाहरण क्या है जो आप उत्पादन कर सकते हैं जो '-एलजीएल' के बिना चलता है लेकिन segfaults के साथ? अपनी बिल्ड कमांड लाइन भी शामिल करें। – nobar
@ नोबार - मैं अब तक किसी किस्मत के साथ समस्या को अलग करने के लिए पिछले घंटे के लिए न्यूनतम उदाहरण का पुनर्निर्माण करने की कोशिश कर रहा हूं! मेरा निर्माण कमांड 'g ++ -O2 -o dc.exe xdriver.cpp fio.o glfuns.o -I/usr/include/gL -lglut -lGL -DLINUX -Wall' है। यह भी कुछ भी लायक नहीं है कि यह segfault होता है ** भले ही मैं किसी भी जीएल या जीएलयूटी कार्यों को कॉल नहीं करता **। – drjrm3