Как найти библиотечную зависимость?

Я на машине с Linux, на которой у меня нет прав root. На этой машине установлен Boost 1.36, но мне нужна более новая версия boost, поэтому я установил локальную версию Boost 1.62. Я связываю некоторые объектные файлы с помощью nvcc. Ссылка также включает около 20 сторонних динамических библиотек. Выходным результатом ссылки является другая динамическая библиотека.

Проблема заключается в следующем: если я запускаю 'ldd' в выходной библиотеке, она говорит мне, что библиотека зависит как от libboost_system.so.1.36.0, так и от libboost_system.so.1.62.0.

Я не могу понять, как libboost_system.so.1.36.0 попал туда. Ни одна из других динамических библиотек не зависит от libboost_system.so.1.36.0 (я запускал ldd для всех из них). Как я могу узнать, откуда взялась зависимость от libboost 1.36?

Вот краткое описание команды компоновщика, которая создает выходную библиотеку:

nvcc --ptxas-options=-v --compiler-options '-fPIC' --shared
lots of object files
lots of -L/wherever -lwhatever options
-o libOutput.so

3 ответа

Эта проблема не относится к использованию nvcc, Когда вы связываете исполняемый файл, вы передаете пути к сторонним библиотекам с -L флаг для компоновщика. Когда вы выполняете ldd или двоичный файл, который в конечном итоге использует вашу библиотеку, вызывается динамический загрузчик. Руководство ld.so(8) описывает порядок, в котором загрузчик ищет пути, когда ищет библиотеки. В вашем случае загрузчик, скорее всего, сначала обнаружит буст 1.36 и только для библиотек, которых нет в версии 1.36, он возвращается к версии 1.62. Я предлагаю вам проверить порядок путей в LD_LIBRARY_PATH переменная окружения.

Также обратите внимание, что ldd является рекурсивным, поэтому не показывает библиотеки, с которыми связана ваша библиотека. Вы можете использовать, например, lddtree упоминается в этом ответе.

Использование objdump -p libABCD.so | grep NEEDED для просмотра зависимостей от отдельных файлов библиотеки. Затем следуйте по выходным библиотекам.

Вместо того, чтобы указывать библиотеки надстроек как -l в командной строке компоновщика, вы также можете указать им полный путь и имя файла. Таким образом, компоновщик не ищет эти библиотеки в пути поиска, и вы можете убедиться, что версия системы не была случайно выбрана.

Если проблема не исчезнет, ​​я бы предложил протестировать минимальный пример, который не требует какой-либо библиотеки BOOST, чтобы увидеть, вытягивает ли nvcc какую-либо системную версию boost-system.

Другие вопросы по тегам