Почему `ldd ` выводит "??? => ???" (знаки вопроса как в библиотеке, так и в локации)?

Предположим, что 1 слово/строка, вы можете сделать это:

sed -nE '/^.{10}$/!d;/[aAeEiIoOuU]{3}/p' words.txt
1
13.08.2019, 19:52
2 ответа

Команда lddпытается связать исполняемый файл или библиотеку с общими библиотеками в вашей системе точно так же, как это происходит при запуске/использовании. Он прочитает ссылки на библиотеки из данного файла и попытается найти их в вашей файловой системе и пути(LD_LIBRARY_PATH). Если он отображает «???», то это означает, что он не может найти некоторые библиотеки в вашей системе (и программа/библиотека, которую вы проверили, скорее всего, не запустится / не будет использоваться ).

Часто возникают проблемы с библиотеками при копировании файла (исполняемого файла или библиотеки общих объектов )из одной системы в другую. Причина в разных системных библиотеках -, даже если они отличаются только версией и существуют иным образом.

Иногда решение состоит в том, чтобы также скопировать отсутствующие библиотеки и поместить их в папку, включенную в LD_LIBRARY_PATH. Вы также можете установить эту переменную для этой цели или добавить новую папку, потому что вы не хотите устанавливать эти скопированные файлы библиотеки в свою систему (! ).

Вы можете узнать, какие библиотеки копировать, запустив lddв исходной системе.

Если это ваша собственная программа или вы скомпилировали ее самостоятельно, вы можете знать, каких библиотек не хватает.

После того, как вы идентифицировали свои библиотеки, вы можете скопировать их в личную папку, например. в ~/libs. Затем добавьте эту папку в путь к библиотеке :

.
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}":~/libs

если переменная уже существует (проверка по echo $LD_LIBRARY_PATH),или

export LD_LIBRARY_PATH=~/libs

если нет (обаbash-синтаксиса оболочки в стиле ).

Затем повторите попытку ldd.

Позже вы сможете запускать свою настоящую программу, всегда используя сценарий оболочки, который устанавливает переменную, а затем запускает вашу программу.

0
28.01.2020, 00:03

Для тех, кто сталкивается с той же проблемой в Windows с MSYS2 (, используя GCC Suite для компиляции общей библиотеки, связывания исполняемого файла с этой библиотекой, а затем обнаруживая, что зависимости отсутствуют во время выполнения ), вы можете

  1. скопируйте общую библиотеку в тот же каталог, что и исполняемый файл.
  2. ссылка на общую библиотеку из того же каталога, что и исполняемый файл.
  3. измените переменную среды пути, чтобы включить каталог, содержащий общую библиотеку.

MSYS2 может предоставлять Unix-подобную -среду в Windows, но нам по-прежнему необходимо придерживаться способа, которым Windows ищет исполняемые файлы (, включая общие библиотеки )во время выполнения (, короче говоря, LD _БИБЛИОТЕКА _PATH не имеет смысла, и компоновщик не заботится о путях, заданных с помощью rpath; PATH следует использовать ).

0
28.01.2020, 00:03

Теги

Похожие вопросы