Как найти библиотечную зависимость?
Я на машине с 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.