2015-06-16 5 views
0

Я отлаживал проект, который зависит от набора библиотек, включая libfreenect, OpenGL и OpenCL. Проблема в том, что черный экран был выходом.Порядок связанных библиотек C++ linker

В качестве опции отладки я полностью удалил код OpenCL и связанную библиотеку, пытаясь убедиться, что OpenGL работает нормально и, к счастью, это так.

То, что я заметил, и не понимаю, что мой проект хорошо работает, используя этот порядок библиотек

-lfreenect -lGL -lglut -lGLU -lOpenCL 

С другой стороны, черный экран дается при использовании этого порядка

-lfreenect -lOpenCL -lGL -lglut -lGLU

Мой вопрос: почему порядок связанных библиотек влияет на выход программы?

+0

В чем вопрос? – n0rd

+2

опубликуйте фрагмент исходного кода, на который влияет заказ. Трудно сделать вывод о том, сколько информации вы предоставили. – Barracuda

+1

Если две библиотеки содержат одну и ту же точку входа, она будет использовать первую найденную, которая была бы одной из первой указанной библиотеки. Я подозреваю, что OpenCL и GL могут иметь общие точки входа в вашей системе. Кстати, все эти заказы выглядят сомнительными. '-lglut' и' -lGLU' всегда должны быть перед '-lGL'. –

ответ

3

Интерфейсная библиотека OpenCL, установленная в вашей системе, может использовать другой libGL.so, чем libGL.so, который в конечном итоге будет загружен вашей программой. Например, если вы установили реализацию Mesa OpenCL, но используете драйвер NVidia, то связь с OpenCL от Mesa может привести к конфликту LibGL от Mesa в libGL, который необходим для работы OpenGL в вашей системе; конечно, это просто догадки.

Попробуйте использовать ldd на вырабатываемую программу двоичного в любой конфигурации заказа ссылки и посмотреть, какие общие объекты (в этом пути) это на самом деле тянет в

+0

Отлично, это именно то, что произошло в моем случае. Также спасибо за совет ldd. –

1

Подумайте об этом так:.

У вас есть свой объект файлы скомпилированы. Этим файлам нужны дополнительные методы, которых там нет, и на этапе компоновки вам необходимо предоставить библиотеки, которые «покрывают» эти необходимые методы, поэтому могут создавать аккуратный исполняемый файл.

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

Если вы включили OpenCL в первую библиотеку, но ваш proyect напрямую не вызывает методы OpenCL, то компоновщик будет отбрасывать эту библиотеку. И в дальнейшем, когда вы включаете библиотеку, которая нуждается в OpenCL, она вытащит «неопределенный метод XXXXX», потому что эта библиотека уже обработана. Или, в вашем случае, он может использовать другую внутреннюю библиотеку, отличную от той, которую вы намеревались использовать.

Хорошим правилом является включение «основных» библиотек в последнюю очередь, чтобы они использовались во всех других библиотеках. В этом случае OpenCL не зависит от какой-либо библиотеки GL, поэтому вы должны добавить ее последним.

Смежные вопросы