Я пытаюсь скомпилировать один из этих миксов 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);
Сообщение «неопределенный символ» указывает, что это не компоновщик, а проблема с модулем компиляции: компилятор не знает символ glXMakeCurrent
потому что он не был ни объявлен, ни определен, но вы используете его.
Вероятно, заголовок GLX не был включен.
добавлять
#include <GL/glx.h>
Как выяснилось, проблема OP была связана с тем, что сборка состояла из каскадных общих объектов, образующих модуль Python. Один общий объект реализует фактические операции OpenGL, а другой выполняет взаимодействие с интерпретатором Python.
Теперь общие объекты (.so) сами по себе являются полностью квалифицированными двоичными файлами ELF, каждый из которых имеет свою собственную таблицу символов импорта и экспорта. Общий объект может быть сконфигурирован для предоставления всех символов другого общего объекта, на который он ссылается. Однако общий объект не увидит никаких символов блоков компиляции, с которыми он связан (если вы подумаете об этом, этого следует ожидать, так как общий объект не может и не должен делать никаких предположений относительно среды, в которой он будет находиться связаны в).
Следовательно, при компиляции и связывании нескольких общих объектов в более крупной сборке важно индивидуально связывать каждый общий объект с любыми библиотеками, которые ему понадобятся во время выполнения.
Как и @datenwolf, для ссылок необходимы особые меры предосторожности. Для меня это загадка, но использование ldd помогает. Таким образом, в основном я использовал ldd как в конечном, так и в промежуточном объектах общего доступа. Несмотря на аргументы командной строки, моя библиотека не была связана с libGL и ее зависимостями, пока я не включил ‘-lGL -lGLU -lX11’ в промежуточный шаг (создание liblayouter.so).