Есть несколько вещей, которые нужно проверить в вашей команде и настройке.Также ознакомьтесь с этапами C ++ .Вы должны понимать это, чтобы полностью понять ваши проблемы.
Глядя на ваш комментарий, вы столкнулись с тремя основными проблемами:
- Компиляция (после предварительной обработки и перед сборкой и компоновкой)
- Связывание (еще во время работы компилятора)
- Связывание во время выполнения (во время выполнения скомпилированного двоичного файла)
Компиляция
Полученная ошибканаходится в фазе компиляции, прежде чем связать двоичный файл.Эта ошибка может быть сгенерирована либо потому, что:
- вы забыли
#include
для заголовка, который определяет ExampleClass
вы не указываете компилятору правильный путь дляпоиск заголовков.В вашей команде вы говорите компилятору искать заголовки в /lib
(каталог, который начинается с корня файловой системы), в то время как я совершенно уверен, что вы хотите искать их в каталоге относительно вашего текущего рабочего каталога,значение -Ilib -Isrc
.
Кстати, я настоятельно рекомендую вам поместить весь ваш исходный файл в каталог src
и все заголовки в каталог include
, что обычно делается в сложных проектах C / C ++.
Связывание
Как только вы исправите фазу компиляции, вы, вероятно, получите проблему со связыванием, поскольку ваша библиотека не соблюдает соглашение об именах, используемое в linux для общих объектов.Имя файла для библиотеки LIBRARYNAME
должно быть libLIBRARYNAME.so
.
В некоторых случаях у вас может быть несколько версий библиотеки, поэтому можно добавить версию с семантическим версионным соглашением после расширения so
(например, * 1044).* для версии 2.1 вашей библиотеки).
Чтобы связать вышеупомянутую библиотеку, вы должны использовать опцию -lLIBRARYNAME
.
Чтобы сообщить компилятору, где найти библиотеку во время компоновки, вы должны указать путь с -L
, но эта опция информирует только компилятор и не сохраняет положение такой библиотеки в исполняемом файле.
Runtime Linking
В этом случае есть два основных сценария (я буду немногонебрежно, но просто чтобы указать вам правильное направление. Полное объяснение может потребовать намного больше места ... и времени):
- Вы можете жестко закодировать положение разделяемой библиотеки в вашем двоичномиспользуя
rpath
, но если вы распространяете свое приложение, у конечного пользователя должна быть библиотека в том же пути, который вы указали через rpath, и именно поэтому я стараюсь избегать этого решения. - Современная система Linux способна искать требуемый общий объект (именно поэтому существует соглашение об именах).Поиск выполняется в доверенных каталогах , а путь поиска настраивается с помощью файла конфигурации
ldconfig
(или переменной $LD_LIBRARY_PATH
env).Если в пути поиска установлена новая библиотека, кэш компоновщика времени выполнения должен быть обновлен (опять же, это делается через ldconfig
или через перезагрузку).Я настоятельно рекомендую вам прочитать ссылку о ldconfig
, поскольку она объясняет, как настроить новый путь поиска (например, /usr/local/lib
в вашем случае).
Вы можете проверить, способен ли двоичный файлнайти все необходимые общие объекты с помощью команды ldd BINARY_NAME
(в вашем случае ldd a.out
).