6

Вопрос по linux, opengl, c++ – OpenGL Linux неопределенная ссылка на основные функции

Я написал программу на Ubuntu 11.04, которая использует freeglut. Работало нормально. Затем я получил другой компьютер и попытался запустить программу на новой установке Ubuntu 11.04. Не работает. Итак, я установил

sudo apt-get install freeglut3 freeglut3-dev libglew1.5 libglew1.5-dev libglu1-mesa libglu1-mesa-dev libgl1-mesa-glx libgl1-mesa-dev mesa-common-dev gcc

и попытался запустить программу, которая импортирует



    #include <GL/freeglut.h>
    #include <GL/gl.h>
    #include <GL/glu.h>

используя команду

g++ -lGL -lGLU -lglut Driver.cpp -o a

Однако компоновщик или что-либо другое выдает примерно 200 ошибок вида:



    Driver.cpp:(.text+0x3c6b): undefined reference to `glutSolidSphere'
    Driver.cpp:(.text+0x3c75): undefined reference to `glEnable'
    Driver.cpp:(.text+0x3c9a): undefined reference to `glColor4f'
    Driver.cpp:(.text+0x3cb5): undefined reference to `glRotatef'
    Driver.cpp:(.text+0x3d02): undefined reference to `glutSolidSphere'
    Driver.cpp:(.text+0x3d07): undefined reference to `glutSwapBuffers'

В чем причина проблемы?

  • Это обычно проблема со статически связанными библиотеками. Я не знаю, что могло стать причиной проблемы с общими библиотеками, что имеет место.

    от
  • Почему ваш исходный файл называется .cpp, если вы компилируете с помощью gcc? Если это C ++, вы должны скомпилировать с g ++, если это C, он должен называться что-то .c.

    от lvella
  • Еще одна опечатка в публикации. Зоркий глаз.

    от comp sci balla
  • Попробуйте поставить библиотекиafter ваш исходный файл в вашей компиляции.

    от Mat
  • Что это за Driver.cpp? Вы включаете его из program.cpp?

    от lvella
  • Опечатка в постинге. Я использовал g ++

    от comp sci balla
  • 16

    Порядок

    в котором вы указываете объекты, на которые хотите связать (включая статические и динамические библиотеки), может иметь значение.

    Попробуйте с:

    g++ Driver.cpp -lGL -lGLU -lglut  -o a
    

    (Не уверен насчет порядка libs, но это выглядит хорошо.)

    Идея при создании командной строки заключается в том, что еслиa требуется символ изb, b должен появитьсяafter a в командной строке.

    Проблема порядка ссылок возникает (или нет) с GCC / ld для совместно используемых библиотек в зависимости (скорее всего, среди прочего - я здесь не эксперт),--as-needed флаг ссылки установлен или нет. (См., Например, предыдущий элемент в Gentoo & s; sпо мере необходимости руководство по переходу.)
    Процесс связывания устраняет ненужные символы как можно скорее, когда--as-needed является активным, что вызывает проблемы, если порядок ссылок не является «правильным». Это сделано для уменьшения количества ненужных зависимостей, присутствующих в конечных исполняемых файлах.
    Это не происходит (или менее), если--as-needed не активен - все символы сохраняются в этом случае, и порядок ссылок не имеет большого значения (более или менее - опять же, я не эксперт).

    Поскольку в разных дистрибутивах используются разные значения по умолчанию для этого флага, поведение GCC может показаться противоречивым, но это только впечатление.