ld не может найти общую библиотеку
Примечание: я посетил много тем с вопросами, похожими на эту, хотя решения, выбранные как принятые, были всеми вещами, которые я уже попробовал, поэтому, пожалуйста, рассмотрите это, прежде чем отмечать как дубликат.
Кроме того, я новичок в Linux в целом, поэтому не стесняйтесь поправлять меня, если я говорю что-то в корне неверное.
Эта проблема:
Я пытаюсь создать и использовать разделяемую библиотеку C++, и, хотя кажется, что часть "создания" завершена, я пытаюсь создать ссылку на нее, но я не могу ее увидеть.
Вот что мне уже удалось сделать:
- Скомпилировал все.cpp файлы с явно указанным -fPIC
Создал библиотеку с
g++ -shared -fPIC -Wl,-soname,libcustom_program_options.so.1 -o libcustom_program_options.so.1.0.1 *.o
Запустите 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
Так что это в значительной степени решило это. Виновником был я, не зная, какое именно имя файла искал компоновщик.