ld не может найти общую библиотеку

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

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

Эта проблема:

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

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

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

    g++ -shared -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: error: ld вернул 1 состояние выхода


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

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. т.1.0.1 (обратите внимание на номер версии).

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

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

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

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

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