2015-09-27 15 views
6

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.

+2

Chạy chương trình của bạn dưới gdb và cho biết vị trí của nó là segfaulting. –

+1

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

+0

@ 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

Trả lời

0

Sau khi có cùng một vấn đề với chương trình OpenGL tầm thường, tôi đã tìm thấy giải pháp here.

Tóm lại, chỉ cần thêm -pthread vào cờ trình biên dịch đã không hoạt động đối với tôi vì tôi không sử dụng libpthread ở bất kỳ đâu nên nó không thực sự được liên kết. Bí quyết là buộc g ++ nghĩ rằng tôi đang sử dụng libpthread và do đó buộc nó phải được liên kết, bằng cách thêm đoạn mã nhỏ này vào tệp main.cpp của tôi:

#if defined(__unix__) 

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

#endif 
Các vấn đề liên quan