Избавьтесь от "gcc -/usr/bin/ld: warning lib not found"

У меня есть следующее предупреждение во время ссылки:

/usr/bin/ld: warning: libxxx.so.6, needed by /a/b/c/libyyy.so, not found (try using -rpath or -rpath-link)

Настройка переменной окружения LD_LIBRARY_PATH = path_to_libxxx.so.6 отключает предупреждение (добавление -Lpath_to_libxxx.so.6 не помогает).

У меня есть отдельный сервер компиляции, где результирующий двоичный файл компилируется. Бинарный файл выполняется на другом сервере, а libxxx.so.6 - двоичным (проверяется с помощью ldd executable).

Есть ли другой способ избавиться от предупреждения во время компиляции (у меня это несколько раз, и это очень раздражает)?

Ответ 1

Вам нужно добавить эквивалент динамической библиотеки -L:

-Wl,-rpath-link,/path/to/lib

Это приведет к тому, что компоновщик будет искать общие библиотеки в нестандартных местах, но только для проверки правильности ссылки.

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

-Wl,-rpath,/path/to/lib

Но если ваша программа работает нормально без этого, вам это не понадобится.

Ответ 2

Убедитесь, что пути к необходимым библиотекам известны компоновщику времени выполнения. Это делается путем добавления файла в/etc/ld.so.conf.d/с необходимым путем. Например, /etc/ld.so.conf.d/foo со следующим содержимым:

/usr/local/lib/foo/

Если у вас очень старая версия Linux, возможно, не поддерживается поддержка /etc/ld.so.conf.d/, и в этом случае вам, возможно, придется добавлять пути непосредственно в файл /etc/ld.so.conf.

После того, как вы это сделали, вам нужно обновить базу данных компоновщика, выполнив команду "ldconfig".

Ответ 3

Единственный способ отключить это предупреждение с помощью параметров командной строки - это флаг -L, который с любопытством не работает для вас (возможно, вы можете опубликовать более подробную информацию об этом). Поскольку предупреждение генерируется ld, мы могли бы попытаться использовать -Wl,option, чтобы отключить предупреждение компоновщика, но из документации GNU ld, однако там это не опция для (de) активации этих предупреждений.

Таким образом, это оставляет нам писать оболочку script, отфильтровывая это предупреждение или компилируя пользовательскую версию ld.

Ответ 4

Я знаю, что это старо, но здесь лучшее исправление:

Основная причина:

Проблема на самом деле возникает, когда LD, вызываемый GCC, начинает разрешать библиотечных зависимостей. Как GCC, так и LD знают о sysroot содержащих библиотеки, однако LD может отсутствовать один критический компонент: файл /etc/ld.so.conf. Heres файл exampleld.so.conf из системы PI малины:

включить/etc/ld.so.conf.d/*. conf

Каталог/etc/ld.so.conf.d содержит следующие файлы:

00-vmcs.conf:/Опт/Bc/Lib

рука-Linux-gnueabihf.conf:

/lib/arm-linux-gnueabihf/usr/lib/arm-linux-gnueabihf

libc.conf:

/USR/локальные/Библиотека

Универсальное решение

Проблема может быть легко решена путем копирования файлов конфигурации LD в место, где их можно найти с помощью перекрестных привязок LD. Theres одна ловушка: если ваша кросс-цепочка была построена с помощью MinGW (большинство из них), вероятно, у него не было доступа к функции glob(), поэтому он не сможет проанализировать выражение include с включенным подстановочным знаком как *.conf. Обходной путь здесь состоит в том, чтобы просто вручную объединить содержимое всех .conf файлов из /etc/ld.so.conf.d и вставить их в /etc/ld.so.conf

*/опция/VC/Библиотека

/Library/рука-Linux-gnueabihf

/USR/Library/рука-Linux-gnueabihf

/USR/локальные/Библиотека *

Как только вы создадите файл ld.so.conf в правильной папке, toolchain сможет разрешать все общие ссылки библиотек автоматически, и вы не увидите это сообщение об ошибке снова!