为什么简单地链接GL导致段错误?

时间:2015-09-27 04:30:33

标签: linux opengl

我正在Linux上编写一个OpenGL应用程序,我可以轻松地使用-lGL创建一个窗口,但是一旦我与-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。令我感到困惑的是,除了打印然后退出之外它应该什么都不做......但不知何故它是段错误。

一旦我取消$sales_by_hours = array(); foreach($sales_array as $element) { // the H is 24-hour format of an hour with leading zeros - 00 through 23 $key = date('H:00', $time); // make sure the key exists in the array if(!isset($sales_by_hours[$key])) { $sales_by_hours[$key] = array(); } $sales_by_hours[$key][] = $element; } ,我就会运行该计划并将其打印出来#34;我们到目前为止......&#34;然后退出。

1 个答案:

答案 0 :(得分:0)

在我自己遇到一个简单的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