2015-09-27 5 views
6

私はLinuxにOpenGLアプリケーションを書いていますが、GLUTを使ってウィンドウを簡単に作成できますが、-lGLとリンクするとすぐに、私はsegfaultを取得します。これを引き起こす原因は何ですか?なぜ単にGLにリンクすると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)を得る。私が混乱しているのは、印刷して終了するだけで何もしてはならないということです。しかし、何とかそれは失敗します。

私が-lGLを離そすと、私はプログラムを実行し、「私たちはこれを遠くに持っています...」と表示して終了します。

+2

プログラムをgdbで実行し、segfaultingを指定します。 –

+1

'-lGL'を使わずにsegfaultsを実行することができる最小のソースコードの例は何ですか?また、ビルドコマンドラインも含めてください。 – nobar

+0

@nobar - これまでのところ問題を特定するために、過去1時間の最小限の例を再構築しようとしていました!私のビルドコマンドは 'g ++ -O2 -o dc.exe xdriver.cpp fio.o glfuns.o -I/usr/include/GL -lglut -lGL -DLINUX -Wall'です。 GLやGLUT関数を呼び出さなくても**このセグメンテーションが発生することは何も価値がない**。 – drjrm3

答えて

0

自分自身の小さなOpenGLプログラムで同じ問題が発生した後、私は解答hereを見つけました。

要約すると、コンパイラフラグに-pthreadを追加するだけでは、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 
関連する問題