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

6

Я написал программу на 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'

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

Опечатка в постинге. Я использовал g ++ comp sci balla
Что это за Driver.cpp? Вы включаете его из program.cpp? lvella
Попробуйте поставить библиотекиafter ваш исходный файл в вашей компиляции. Mat
Еще одна опечатка в публикации. Зоркий глаз. comp sci balla
Почему ваш исходный файл называется .cpp, если вы компилируете с помощью gcc? Если это C ++, вы должны скомпилировать с g ++, если это C, он должен называться что-то .c. lvella

Ваш Ответ

1   ответ
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 может показаться противоречивым, но это только впечатление.

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

Похожие вопросы