Правильное связывание библиотеки GLX в Ubuntu

Я пытаюсь скомпилировать один из этих миксов X11 + OpenGL, но мне не повезло с компилятором. В частности, я получаю:

  undefined symbol: glXMakeCurrent

я пытался

   -lX11 -lGLU -lGL -lXext

в качестве аргументов для компоновщика, и некоторые их перестановки, но пока не повезло.

Я использую Ubuntu 12.04, и я установил все пакеты разработки, связанные с opengl, которые, как мне показалось, были нечеткими. Я также занимаюсь разработкой на C ++, что может вызвать проблемы, если заголовки opengl не готовы к этому … но они правы?

Я даже явно искал символ с помощью fgrep в / usr / lib / x86_64-linux-gnu /, но его там нет, и, кроме того, `nm ‘говорит, что символов нет.

Итак, как правильно связать с GLX?

РЕДАКТИРОВАТЬ: Это проблема связывания, ошибка возникает, когда Python пытается загрузить скомпилированный (и неправильно связанный) модуль. Не во время компиляции.

РЕДАКТИРОВАТЬ: Вот журнал компиляции

    scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o build/debug/objects/alve/layouter/flowing_data.os -c -std=c++0x -g -I/usr     /include/python2.7 -fPIC -I/opt/cairo_new/include/cairo/ -I/opt/boost_1_48_0/include -DMIC_RT_SPEED_BACKS -Icsrc csrc/alve/layouter/flowing_data.cpp
g++ -o build/debug/objects/alve/layouter/liblayouter.so -L/opt/cairo_new/lib -L/opt/boost_1_48_0/lib -shared build/debug/objects/alve/layouter/flowing_data.os build/debug/objects/alve/layouter/show_network.os -Lbuild/debug/lib -Llibdeps
Install file: "build/debug/objects/alve/layouter/liblayouter.so" as "build/debug/lib/liblayouter.so"g++ -o build/debug/objects/alve/layouter/liblayouter_mod.so -L/opt/cairo_new/lib -L/opt/boost_1_48_0/lib -shared build/debug/objects/alve/layouter/module.os  Lbuild/debug/lib -Llibdeps -lboost_python build/debug/objects/alve/layouter/liblayouter.so -lcairo -lX11 -lGL -lGLU -lXext
scons: done building targets.

и вот как эта функция называется:

glXMakeCurrent (dpy, win, ctx);

-2

Решение

Сообщение «неопределенный символ» указывает, что это не компоновщик, а проблема с модулем компиляции: компилятор не знает символ glXMakeCurrent потому что он не был ни объявлен, ни определен, но вы используете его.

Вероятно, заголовок GLX не был включен.

добавлять

#include <GL/glx.h>

Как выяснилось, проблема OP была связана с тем, что сборка состояла из каскадных общих объектов, образующих модуль Python. Один общий объект реализует фактические операции OpenGL, а другой выполняет взаимодействие с интерпретатором Python.

Теперь общие объекты (.so) сами по себе являются полностью квалифицированными двоичными файлами ELF, каждый из которых имеет свою собственную таблицу символов импорта и экспорта. Общий объект может быть сконфигурирован для предоставления всех символов другого общего объекта, на который он ссылается. Однако общий объект не увидит никаких символов блоков компиляции, с которыми он связан (если вы подумаете об этом, этого следует ожидать, так как общий объект не может и не должен делать никаких предположений относительно среды, в которой он будет находиться связаны в).

Следовательно, при компиляции и связывании нескольких общих объектов в более крупной сборке важно индивидуально связывать каждый общий объект с любыми библиотеками, которые ему понадобятся во время выполнения.

1

Другие решения

Как и @datenwolf, для ссылок необходимы особые меры предосторожности. Для меня это загадка, но использование ldd помогает. Таким образом, в основном я использовал ldd как в конечном, так и в промежуточном объектах общего доступа. Несмотря на аргументы командной строки, моя библиотека не была связана с libGL и ее зависимостями, пока я не включил ‘-lGL -lGLU -lX11’ в промежуточный шаг (создание liblayouter.so).

0

По вопросам рекламы [email protected]