为什么简单地链接到GL会导致段错误?
问题描述:
我正在Linux上编写一个OpenGL应用程序,我可以很容易地创建一个使用GLUT
的窗口,但只要我连接-lGL
,就会出现段错误。任何想法会造成这种情况?为什么简单地链接到GL会导致段错误?
即使使用-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
,我运行该程序,它打印出“我们得到了这么远......”然后退出。
答
在自己有一个微不足道的OpenGL程序出现同样的问题后,我找到了一个解决方案here。
总之,仅仅将-pthread
添加到编译器标志对我来说不起作用,因为我没有在任何地方使用libpthread,所以它实际上没有链接进去。技巧是强制g ++认为我在使用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
在gdb下运行你的程序,并指出它在哪里是segfaulting。 –
什么是可以生成的最小源代码示例,其运行时没有使用-lGL而是使用段错误?还包括你的构建命令行。 – nobar
@nobar - 我一直在尝试重建一个过去一小时的最小例子,以隔离目前为止没有运气的问题!我的构建命令是'g ++ -O2 -o dc.exe xdriver.cpp fio.o glfuns.o -I/usr/include/GL -lglut -lGL -DLINUX -Wall'。即使在我没有调用任何GL或GLUT函数时,也不值得这段错误发生**。 – drjrm3