Tôi đang viết một ứng dụng OpenGL trên Linux và tôi có thể tạo một cửa sổ bằng cách sử dụng GLUT
dễ dàng, nhưng ngay sau khi tôi thậm chí liên kết với -lGL
, tôi nhận được một segfault. Bất kỳ ý tưởng gì sẽ gây ra điều này?Tại sao chỉ đơn giản là liên kết với GL gây ra một segfault?
Tôi không nhận được bất kỳ cảnh báo trình biên dịch hoặc lỗi nào ngay cả với -Wall
. Chỉ khi tôi chạy chương trình đó là cho tôi một segfault.
Tôi chưa từng sử dụng gdb
trước đây, nhưng thông tin này có hữu ích không?
(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)
tôi đã nhận nó xuống một ví dụ tối thiểu bây giờ nó tôi vẫn bối rối về những gì đang xảy ra:
#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) {
}
tôi biên dịch với g++ -g -o dc.exe xdriver.cpp -I/usr/include/GL -lglut -lGL -DLINUX -Wall
và khi tôi chạy mã, nó in ra không có gì ... Tôi chỉ nhận được Segmentation fault (core dumped)
. Điều làm tôi bối rối là nó không nên làm gì ngoài việc in ra và sau đó bỏ đi ... nhưng bằng cách nào đó nó lại bị phân tán.
Ngay sau khi tôi cất cánh -lGL
, tôi chạy chương trình và nó in ra "Chúng tôi đã nhận điều này đến nay ..." và sau đó thoát.
Chạy chương trình của bạn dưới gdb và cho biết vị trí của nó là segfaulting. –
Ví dụ mã nguồn nhỏ nhất mà bạn có thể sản xuất chạy mà không có '-lGL' nhưng segfaults là gì? Cũng bao gồm dòng lệnh xây dựng của bạn. – nobar
@ nobar - Tôi đã cố gắng xây dựng lại một ví dụ tối thiểu trong một giờ qua để cô lập vấn đề mà không có may mắn cho đến nay! Lệnh xây dựng của tôi là 'g ++ -O2 -o dc.exe xdriver.cpp fio.o glfuns.o -I/usr/include/GL -lglut -lGL -DLINUX -Wall'. Nó cũng không có giá trị gì mà segfault này xảy ra ** ngay cả khi tôi không gọi bất kỳ GL hoặc GLUT chức năng **. – drjrm3