私は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
を離そすと、私はプログラムを実行し、「私たちはこれを遠くに持っています...」と表示して終了します。
プログラムをgdbで実行し、segfaultingを指定します。 –
'-lGL'を使わずにsegfaultsを実行することができる最小のソースコードの例は何ですか?また、ビルドコマンドラインも含めてください。 – nobar
@nobar - これまでのところ問題を特定するために、過去1時間の最小限の例を再構築しようとしていました!私のビルドコマンドは 'g ++ -O2 -o dc.exe xdriver.cpp fio.o glfuns.o -I/usr/include/GL -lglut -lGL -DLINUX -Wall'です。 GLやGLUT関数を呼び出さなくても**このセグメンテーションが発生することは何も価値がない**。 – drjrm3