2013-11-15 8 views
12

Utworzono prosty plik OpenGL w cpp. Działa na komputerze Uniwersytetu. Mogę skompilować plik, ale nie mogę uruchomić skompilowanego pliku. Błąd pojawia się:Błąd podczas uruchamiania skompilowanego pliku C++ (wykorzystuje OpenGL). Błąd: "Wykryto niespójność przez ld.so: dl-version.c: 224"

Inconsistency detected by ld.so: dl-version.c: 224: _dl_check_map_versions: Assertion `needed != ((void *)0)' failed! 

kod pliku to:

// 
// Model.cpp 
// cg-projects 
// 
// Created by HUJI Computer Graphics course staff, 2013. 
// 

#include "ShaderIO.h" 
#include "Model.h" 

#include <GL/glew.h> 
#ifdef __APPLE__ 
#include <OpenGL/OpenGL.h> 
#else 
#include <GL/gl.h> 
#endif 

#include <glm/glm.hpp> 
#include <glm/gtc/type_ptr.hpp> 
#include "glm/gtc/matrix_transform.hpp" 

#define SHADERS_DIR "shaders/" 

Model::Model() : 
_vao(0), _vbo(0) 
{ 

} 

Model::~Model() 
{ 
    if (_vao != 0) 
     glDeleteVertexArrays(1, &_vao); 
    if (_vbo != 0) 
     glDeleteBuffers(1, &_vbo); 
} 

void Model::init() 
{ 
    programManager::sharedInstance() 
    .createProgram("default", 
        SHADERS_DIR "SimpleShader.vert", 
        SHADERS_DIR "SimpleShader.frag"); 

    GLuint program = programManager::sharedInstance().programWithID("default"); 

    // Obtain uniform variable handles: 
    _fillColorUV = glGetUniformLocation(program, "fillColor"); 

    // Initialize vertices buffer and transfer it to OpenGL 
    { 
     // For this example we create a single triangle: 
     const float vertices[] = { 
      0.75f, 0.75f, 0.0f, 1.0f, 
      0.75f, -0.75f, 0.0f, 1.0f, 
      -0.75f, -0.75f, 0.0f, 1.0f, 
     }; 

     // Create and bind the object's Vertex Array Object: 
     glGenVertexArrays(1, &_vao); 
     glBindVertexArray(_vao); 

     // Create and load vertex data into a Vertex Buffer Object: 
     glGenBuffers(1, &_vbo); 
     glBindBuffer(GL_ARRAY_BUFFER, _vbo); 
     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

     // Tells OpenGL that there is vertex data in this buffer object and what form that vertex data takes: 

     // Obtain attribute handles: 
     _posAttrib = glGetAttribLocation(program, "position"); 
     glEnableVertexAttribArray(_posAttrib); 
     glVertexAttribPointer(_posAttrib, // attribute handle 
           4,   // number of scalars per vertex 
           GL_FLOAT, // scalar type 
           GL_FALSE, 
           0, 
           0); 

     // Unbind vertex array: 
     glBindVertexArray(0); 
    } 
} 

void Model::draw() 
{ 
    // Set the program to be used in subsequent lines: 
    GLuint program = programManager::sharedInstance().programWithID("default"); 
    glUseProgram(program); 

    GLenum polygonMode = GL_LINE; // Also try using GL_FILL and GL_POINT 
    glPolygonMode(GL_FRONT_AND_BACK, polygonMode); 

    // Set uniform variable with RGB values: 
    float red = 0.3f; float green = 0.5f; float blue = 0.7f; 
    glUniform4f(_fillColorUV, red, green, blue, 1.0); 

    // Draw using the state stored in the Vertex Array object: 
    glBindVertexArray(_vao); 

    size_t numberOfVertices = 3; 
    glDrawArrays(GL_TRIANGLES, 0, numberOfVertices); 

    // Unbind the Vertex Array object 
    glBindVertexArray(0); 

    // Cleanup, not strictly necessary 
    glUseProgram(0); 
} 

void Model::resize(int width, int height) 
{ 
    _width = width; 
    _height = height; 
    _offsetX = 0; 
    _offsetY = 0; 
} 

używam ubuntu 13.10.

+0

Zapytany tego samego dnia przez tego samego użytkownika na [Zapytaj Ubuntu] (http://askubuntu.com/questions/377562/problem-when-trying-to-run-a-compiled-c-file-uses- opengl-error-inconsiste), co jest [w odniesieniu do konsensusu społeczności] (http://meta.stackexchange.com/questions/64068/is-cross-posting-a-question-on-multiple-stack-exchange-sites-permitted -if-the-qu). Proponuję, aby ta była zamknięta, a prośba nie. –

+0

The Ask Ubuntu one closed. –

Odpowiedz

20

Wygląda na to, że niektóre rzeczy uległy zmianie w przypadku aktualizacji Ubuntu 13.10 sw. Miałem również kod, który został skompilowany i uruchomiony bez problemu i tylko jeden dzień zacząłem otrzymywać to samo Asercja `needed! = ((Void *) 0) 'nie powiodło się! błąd, ale tylko wtedy, gdy ponownie skompilowałem mój kod z aktualnymi wersjami gcc/lib.

Po debugowanie I okazało się, że błąd pochodzi z assert /lib/i386-linux-gnu/ld-2.17.so

 struct link_map *needed = find_needed (strtab + ent->vn_file, map); 

    /* If NEEDED is NULL this means a dependency was not found 
    and no stub entry was created. This should never happen. */ 
    assert (needed != NULL); 

Mówi się, że to nigdy nie powinno się zdarzyć i nie ma co powiedzieć jest potrzebny, ale nie można go znaleźć. Niektóre prace gdb i znalazłem, że potrzebuje libpthread.so.0. Dobrym pytaniem jest to, dlaczego aplikacja łącząca/usr/bin/ld linker i ld.so nie zgadzają się co do potrzeby tej biblioteki.

Nie użyłem celowo libpthread, ale skądś dostałem się do odnośnika do odnośnika do __pthread_key_create @@ GLIBC_2.0 Nie wiem, skąd to się bierze, ale może to spowodować konieczność libpthread.so bez dodawania POTRZEBNYCH libpthread.so .0 w następujący sposób na objdump -p:

Dynamic Section: 
NEEDED    libglut.so.3 
NEEDED    libGLU.so.1 
NEEDED    libGL.so.1 
NEEDED    libstdc++.so.6 
NEEDED    libgcc_s.so.1 
NEEDED    libpthread.so.0 
NEEDED    libc.so.6 

Nie znalazłem głównej przyczyny tego problemu, ale najmniej obejść. Musisz połączyć swój kod z opcją -pthread i wywołać atrapę do tej biblioteki.

Zdefiniuj w was Makefile bibliotekami

-lglut -lGLU -lGL -lm -pthread 

Wtedy to jakiś manekin funkcję tylko odnieść jakiś libpthread funkcję, aby link Linker go i uzyskać potrzebne libpthread.so.0 a następnie ld.so jest HAP.

#include <pthread.h> 
void junk() { 
    int i; 
    i=pthread_getconcurrency(); 
}; 

To pomogło mi, mam nadzieję, że pomaga.

Jest bardziej analiza w Ubuntu launcpad https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-319/+bug/1248642?comments=all

+1

dzięki za rozwiązania. to działało również dla mnie. jednak do '-pthread' należy dodać 'l', dlatego powinno to być' -lglut -lGLU -lGL -lm -lpthread'. Niestety nie mogłem edytować posta, więc zostawiłem komentarz. – antibus

+0

Mam plik wykonywalny, który używa Intel Threading Building Blocks (TBB), który używa pthreads, który wykazywałby ten sam błąd ld.so. Zapomniałem dodać flagę -pthread do mojego polecenia linkera. Dzięki, oszczędziłeś mi godzin pracy. –

12

Jeśli masz kartę graficzną nvidia jak ja, to może pracować dla Ciebie

 

    g++ -L/usr/lib/nvidia-304/ your-file.cc -lglut -lGLEW -lGL 

Wymień 304 z wersją sterowników nvidia. Więcej szczegółów na temat tego błędu można znaleźć pod tym link.

+0

Dziękuję bardzo za to! Ten folder zawiera inną bibliotekę GL. Zgaduję, że przed dodaniem tego folderu Biblioteki, nie było zamieszania, do której biblioteki GL używać ... W każdym razie to również rozwiązało to dla mnie. – Harry

+0

To działało również dla mnie. Używam nvidia-340, ale twoja poprawka działała :). Dzięki. – krishnab

+0

Dzięki, więc f * cking dużo !! Uratowałem moje życie! –

Powiązane problemy