Связывание динамической библиотеки с ++ продолжает сбой - PullRequest
0 голосов
/ 09 октября 2018

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

В моем текущем каталоге я создал динамическую библиотеку на

/bin/library_test.so

Исходный код и включаемые файлы как обычно в

./lib/ and ./src/

Затем я пытаюсьскомпилировать простой файл main.cpp и связать библиотеку, выполнив

 g++ main.cpp -I/lib/ -L/bin/ -llibrary_test

Но я продолжаю получать сообщения об ошибках, например, «ExampleClass» не был объявлен в этой области, то есть я не связал библиотеку, верно?Как этот класс содержится в моей библиотеке файлов cpp / header.

Я что-то упустил в ссылках или мне нужно добавить команду include в мой файл main.cpp ??

1 Ответ

0 голосов
/ 09 октября 2018

Есть несколько вещей, которые нужно проверить в вашей команде и настройке.Также ознакомьтесь с этапами C ++ .Вы должны понимать это, чтобы полностью понять ваши проблемы.

Глядя на ваш комментарий, вы столкнулись с тремя основными проблемами:

  1. Компиляция (после предварительной обработки и перед сборкой и компоновкой)
  2. Связывание (еще во время работы компилятора)
  3. Связывание во время выполнения (во время выполнения скомпилированного двоичного файла)

Компиляция

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

  • вы забыли #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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...