Примечание: Я посетил много тем с вопросами, подобными этому, хотя решениями, выбранными, как принято, были все вещи, я уже попробовал, поэтому, рассмотрите это прежде, чем отметить как дубликат.
Кроме того, я плохо знаком с Linux в целом, поэтому не стесняйтесь исправлять меня, если я говорю что-то существенно неправильное.
Я пытаюсь создать и пользоваться совместно использованной библиотекой C++ и в то время как "создать" часть, кажется, сделана, при попытке связаться против нее, ld не, чтобы видеть его.
Вот то, что мне уже удалось сделать:
Созданный библиотека с
g ++ - совместно использованный-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: ошибка: ld возвратил 1 статус выхода
Примечание: Я не был уверен, искал ли ld полное имя или soname библиотеки или возможно "имя между lib - и .so. {Версия}", таким образом, я попробовал каждого из тех. Не помог также.
Хорошо, мне наконец удалось решить его.
После того как я проверил, какой файл компоновщик на самом деле ожидает находить, я знал, что сделать затем.
Я сделал это путем вызова:
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
Таким образом, это в значительной степени решило его. Преступник был я не знающий, что было точным именем файла, разыскиваемым компоновщиком.