ld не может найти совместно использованную библиотеку

Примечание: Я посетил много тем с вопросами, подобными этому, хотя решениями, выбранными, как принято, были все вещи, я уже попробовал, поэтому, рассмотрите это прежде, чем отметить как дубликат.

Кроме того, я плохо знаком с Linux в целом, поэтому не стесняйтесь исправлять меня, если я говорю что-то существенно неправильное.

Проблема:

Я пытаюсь создать и пользоваться совместно использованной библиотекой C++ и в то время как "создать" часть, кажется, сделана, при попытке связаться против нее, ld не, чтобы видеть его.

Вот то, что мне уже удалось сделать:

  1. Скомпилированный все .cpp файлы с-fPIC, явно указанным
  2. Созданный библиотека с

    g ++ - совместно использованный-fPIC-Wl,-soname, libcustom_program_options.so.1-o libcustom_program_options.so.1.0.1 *.o

  3. Выполнил ldconfig для обновления кэша загрузчика как это:

    sudo ldconfig-n/usr/local/lib

И когда я пытаюсь связать библиотеку против своей тестовой программы:

g++ main.cpp -o main -L /usr/local/lib -l libcustom_program_options

Вот то, что происходит:

/usr/bin/ld: не может найти-llibcustom_program_options

collect2: ошибка: ld возвратил 1 статус выхода


Примечание: Я не был уверен, искал ли ld полное имя или soname библиотеки или возможно "имя между lib - и .so. {Версия}", таким образом, я попробовал каждого из тех. Не помог также.

1
задан 23 March 2019 в 21:40

1 ответ

Хорошо, мне наконец удалось решить его.

После того как я проверил, какой файл компоновщик на самом деле ожидает находить, я знал, что сделать затем.

Я сделал это путем вызова:

ld -L/usr/local/lib -lcustom_program_options --verbose

Где/usr/local/lib является каталогом, я вставил библиотеку, и custom_program_options является названием библиотеки, лишенной lib - префикс и все префиксы (т.е. расширение и версия).

Поскольку это распечатало список всех продуманных каталогов наряду с точным ожидаемым именем файла, я знал, что это искало libcustom_program_options.so, пока вызов ldconfig (упомянутый в OP) установил ссылку только между libcustom_program_options.so.1, и libcustom_program_options.so.1.0.1 (отметьте номер версии).

Файл ld пытался найти, действительно никогда не существовал.

Решение состояло в том, чтобы создать ссылку вручную:

sudo ln -s /usr/local/lib/libcustom_program_options.so.1 /usr/local/lib/libcustom_program_options.so

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

1
ответ дан 7 December 2019 в 15:06

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

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